2016-09-27 30 views
2

我正在使用RabbitMQ在應用程序(RPC)之間進行通信,我有什麼是調用我需要的方法的適當方式的困境。我有一個包含一堆可用方法的類,我需要執行與我的Rabbit消息中攜帶的字符串相匹配的類。Method.Invoke()vs switch

選項1: 使用顯示的方法HERE更清潔,更好看,但我不知道是否有任何反對它。例如性能損失,不好的做法,等

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

選項2: 使用開關

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

它是否必須非常快? methodNameString是否由外部系統提供(因爲它可以調用對象上的任何方法)? – Chet

+1

我對此的擔心是您高興地調用任何名稱從消息隊列中進入的隨機方法。所以確保他們所屬的班級除了這些方法外沒有任何內容。但這很容易,很明顯。我比開關更喜歡它,並且比'Dictionary '更好。但我住在一個山洞裏,我怕火。 –

+0

@Chet我有一個外部實體調用一個WebService,它會對傳遞的數據進行一堆檢查(xsd等),然後WebService通過消息代理髮送命令給Windows Service –

回答

2

反射的是正常的。反射比(通用)消息隊列快得多。這極不可能是性能瓶頸。

請記住,您允許消息生產者調用任何方法。這可能是一個安全問題,或者是生產者開始調用內部意味着的分層違規。

此外,該系統不能靜態分析。例如,您無法找到通過執行「查找用例」來調用哪些方法。

我提到完整性。我認爲這很正確,很可能。

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]();