我正在使用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();
...
答案 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)
反思的事情没问题。反射比(普通)消息队列快得多。这极不可能成为性能瓶颈。
请记住,您允许邮件生成者调用任何方法。这可能是安全问题,或者如果生产者开始调用内部的东西,则可能是分层违规。
此外,系统的静态可分析性较差。例如,通过执行“查找用法”,您无法找到调用的方法。
我提到这是完整的。我认为这是最合适的方法。