2016-06-08 6 views
2

우리는 DOTNET 코어 그들이 지금은 name && binding flags 또는 name && parameters type (see)에 의해 얻을 수 있습니다,이 오버로드를 제거, 이름과 매개 변수 유형을 일치하는 방법에 대한 액세스 권한을 얻으려면반사 일치하는 이름과 매개 변수 유형을 통해 보호 된 메소드를 얻으려면 어떻게해야합니까? DOTNET 코어 전에

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

을 할 수 있었다 , 전에는 좋아하지 않아.

GetRuntimeMethodsIEnumerable<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