2011-08-24 32 views
2

什麼是使用DynamicMethod.TryInvokeMember()優於使用字典作爲參數嗎?

DynamicObject.TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) 

經過短短調用與此簽名非動態方法在C#4.0(除了語法)的優點:

public object MethodParser(string methodName, Dictionary<string, object> arguments) 

其中MethodName是「方法的名稱「參數是參數名稱和參數值的字典(MethodParser只是一個任意名稱)

換句話說,調用

foo.NonExistentMethod(arg1:"a1", arg2:3.14m) 

foo.MethodParser("NonExistentMethod", new Dictionary<string, object>(){{"arg1", "a1"}, {"arg2": 3.14m}}) 

回答

3

你有更多的能力,而無需重構的DynamicObject以外容易進行性能調整。例如,如果在分析過程中發現對該對象的特定動態方法調用是熱點,則只需在DynamicObject上靜態添加該特定方法,不僅可以獲得非字符串查找動態調用(在第一個調用),但是您可以以乾淨的方式將您的特定實現與其他動態代碼分開進行優化。

或者你也可以寫你的整個動態代碼更優化的IDynamicMetaObjectProvider而不是使用DynamicObject(如微軟沒有爲ExpandoObject),然後它不會需要依靠串查找像MethodParserTryInvokeMember每個後續調用會。

如果membername不是真的很重要,那麼很難從這個例子中看出你可以靜態聲明屬性獲取器,它使用DynamicObject.TryInvoke來動態返回動態對象,然後你會得到一些名稱部分的自動完成,並且可以仍然有動態的參數名稱。

但顯然最主要的優勢是我們應該打折的是MethodParser可讀性差得多。

3

動態方法的優點是它們可以提供與動態語言的互操作性,特別是DLR,IronPython和IronRuby提供的動態語言。您提出的第二種方法不提供任何互操作性。

可讀性的另一個巨大優勢。審閱和維護代碼的人可以比基於字典的調用更容易閱讀和理解動態方法調用。

2

這是一個很大的問題。這裏有一些關於這個問題的想法。

優點

1)VS可以提供​​intellisence爲先前使用動態成員,這是一個更好的IDE體驗。

2)它更符合其他代碼,使其更易於閱讀和理解。

3)它可以執行得更好,因爲它是Reflection之上的一層,因此可以緩存委託,因此僅對成員調用Reflection一次。

4)它可以與諸如COM這樣的技術進行互操作,當使用Reflection時這是不正確的,並且避免了在調用之間明確地轉換類型的需要。

5)它提供了比Reflection更鬆散的耦合。可以重新映射內部成員而不影響消耗它的代碼。

6)虛擬化一個實例是可能的。被調用的成員實際上並不需要存在。該實現是完全可擴展的,並允許創建代理/外觀來隱藏來自調用者的實現。

缺點

1)在類型檢查被不必要地丟失情況下容易被濫用。就像輸入關鍵字一樣簡單,只需在Reflection附近理解和編寫代碼即可。

2)使用漂亮的語法是不可能的,以防止魔法字符串。

我確定還有更多隻是想分享一些沒有提出的觀點。