我知道,一般來說,使用反射會帶來性能影響。 (我本人不是反射的粉絲可言,其實,這是一個純粹的學術問題。)你能從MethodInfo對象中得到一個Func <T>(或類似的)嗎?
假設存在某個類,看起來像這樣:這裏
public class MyClass {
public string GetName() {
return "My Name";
}
}
包涵。我知道如果我有一個名爲x
的MyClass
實例,我可以撥打x.GetName()
。此外,我可以將Func<string>
變量設置爲x.GetName
。
現在,這是我的問題。比方說我不知道知道上面的類叫做MyClass
;我有一些對象,x
,但我不知道它是什麼。我可以檢查,看看是否該對象是否具有GetName
方法,通過這樣做:
MethodInfo getName = x.GetType().GetMethod("GetName");
假設getName
不爲空。那麼我不能再進一步檢查getName.ReturnType == typeof(string)
和getName.GetParameters().Length == 0
,在這一點上,我不能肯定我的getName
對象所代表的方法可能肯定以某種方式被轉換爲Func<string>
?
我知道有一個MethodInfo.Invoke
,我也知道我可以一直創建一個Func<string>
,如:
Func<string> getNameFunc =() => getName.Invoke(x, null);
我猜我問的是,如果有任何的路要走從一個MethodInfo
對象到它所代表的實際方法,在處理中產生反射的性能代價,但在之後那個點能夠呼叫我(通過例如Func<string>
或類似的東西)而沒有性能損失。
什麼我預想可能看起來是這樣的:(我認識到,不存在;我不知道是否有什麼像吧)
// obviously this would throw an exception if GetActualInstanceMethod returned
// something that couldn't be cast to a Func<string>
Func<string> getNameFunc = (Func<string>)getName.GetActualInstanceMethod(x);
關於你在編輯中的評論 - 你會看到一個巨大的速度增加與解決方案,如thi s,因爲動態編譯的委託和靜態編譯的委託沒有什麼區別;一旦編制的開銷被分解出來。因爲我發現了表達樹的東西,所以我一直在使用它們,並且很可能將它作爲我的第一個.Net 3.5特性。在第4版中,它更好,因爲您可以編寫多語句代碼 - 因爲DLR所需的擴展名所需。 – 2010-05-30 18:02:48