2016-06-08 72 views
2

DOTNET核心之前,我們能夠做如何通過反射匹配名稱和參數類型來獲得受保護的方法?

var member = type.GetMethod(name, bindingFlags, null, argtypes, null); 

要訪問的方法匹配它的名稱和參數類型,在dotnet的核心,他們移除了這個過載,現在我只能通過name && binding flags OR name && parameters typesee)獲得,但不像以前那樣。

有一種新方法GetRuntimeMethods它返回IEnumerable<MethodInfo>幷包括非公開的方法,但我不能按參數類型過濾。

還有另一種方法GetRuntimeMethod,我可以通過參數類型進行過濾,但它不包含非公共方法。

我已經嘗試過這樣的事情,但未能

var member = type.GetRuntimeMethods().Where(m => 
m.Name == name && (m.GetParameters().Select(p => p.GetType()).ToArray() == argtypes)).FirstOrDefault(); 

有沒有辦法讓通過其名稱和參數類型的方法?

+1

我不認爲你可以比較像數組:'m.GetParameters()選擇(P => p.GetType() ).ToArray()== argtypes)' - 它不會比較數組項,而是數組引用,所以它總是假的。你可以使用'Zip'或'SequenceEqual'來比較數組的內容。 – Pawel

回答

2

是的,那個過載確實是缺失的。你可以使用的是使用GetMethods()並按照你想要的方式過濾輸出。您試圖靠近,但你不能使用==比較數組:

var method = type.GetMethods().FirstOrDefault(m => 
    m.Name == name && m.GetParameters().Select(p => p.ParameterType).SequenceEqual(argTypes)); 
+0

我的不好!像魅力一樣工作,我只需將p.GetType()更改爲p.ParameterType。 TKS – ferodss

相關問題