Method.Invoke()vs switch

时间:2016-09-27 20:21:02

标签: c#

我正在使用RabbitMQ在应用程序之间进行通信(RPC),我有一个两难选择,即调用我需要的方法的适当方法是什么。我有一个包含一堆可用方法的类,我需要执行与Rabbit消息中携带的字符串匹配的方法。

选项1: 使用显示this link的方法更清晰,更好看,但我想知道它是否有任何反对它。例如绩效惩罚,不良做法等

var method = this.GetType().GetMethod(methodNameString);
method.Invoke(this, messagebody);

选项2: 使用开关

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

2 个答案:

答案 0 :(得分:2)

您可以尝试使用Dictionary<string, Action>,以便将所有可能的操作保留在同一位置;所有method1 .. methodN必须采用相同的格式:

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

 ...

 myMethods[methodNameString]();

答案 1 :(得分:2)

反思的事情没问题。反射比(普通)消息队列快得多。这极不可能成为性能瓶颈。

请记住,您允许邮件生成者调用任何方法。这可能是安全问题,或者如果生产者开始调用内部的东西,则可能是分层违规。

此外,系统的静态可分析性较差。例如,通过执行“查找用法”,您无法找到调用的方法。

我提到这是完整的。我认为这是最合适的方法。