C# 方法。Invoke()vs switch

C# 方法。Invoke()vs switch,c#,C#,我正在使用RabbitMQ在应用程序之间通信(RPC),对于调用所需方法的适当方式,我有一个难题。我有一个类,其中包含一组可用的方法,我需要执行一个与兔子消息中的字符串匹配的方法 备选案文1: 使用所示的方法更干净、更美观,但我想知道它是否有任何不利于它的地方。e、 g.绩效处罚、不良行为等 var method = this.GetType().GetMethod(methodNameString); method.Invoke(this, messagebody); 备选案文2: 使用开关

我正在使用RabbitMQ在应用程序之间通信(RPC),对于调用所需方法的适当方式,我有一个难题。我有一个类,其中包含一组可用的方法,我需要执行一个与兔子消息中的字符串匹配的方法

备选案文1: 使用所示的方法更干净、更美观,但我想知道它是否有任何不利于它的地方。e、 g.绩效处罚、不良行为等

var method = this.GetType().GetMethod(methodNameString);
method.Invoke(this, messagebody);
备选案文2: 使用开关

switch(methodNameString)
case: method1
    method1();
case: method2
    method2();
...

您可以尝试使用
字典
,以便将所有可能的操作保持在同一位置;所有
method1
methodN
的格式必须相同:

 // method1..methodN can be called 
 Dictionary<String, Action> myMethods = new Dictionary<String, Action>() {
   {"method1", () => method1()},
   {"method1Synonym", () => method1()},  
   ...
   {"methodN", () => methodN()},
 };

 ...

 myMethods[methodNameString]();
//method1..methodN可以调用
Dictionary myMethods=newdictionary(){
{“method1”,()=>method1()},
{“method1Synonym”,()=>method1(),
...
{“methodN”,()=>methodN()},
};
...
myMethods[methodNameString]();

反射的东西没问题。反射比(公共)消息队列快得多。这极不可能成为性能瓶颈

请记住,您允许消息生产者调用任何方法。这可能是一个安全问题,或者是一个分层违规,如果制作人开始调用内部的东西

此外,系统的静态分析能力较差。例如,您无法通过执行“find Usages”来发现调用了哪些方法


我提到这一点是为了完整性。我认为这很可能是正确的方法。

是否必须非常快?methodNameString是否由外部系统提供(因为它可以调用对象上的任何方法)?我担心的是,您正在愉快地调用任何名称来自消息队列的随机方法。因此,请确保它们所属的类中除了这些方法之外没有其他内容。但这很简单,也很明显。我喜欢它比开关好得多,也比字典好得多。但是我住在一个山洞里,我怕火。@Chet我有一个外部实体调用一个WebService,它对传递的数据进行一系列检查(xsd等),然后WebService通过消息代理将命令发送到Windows服务,所以性能不是问题(在跨越进程边界时会损失更多)。只要确保目标类上没有WS不应该调用的方法。