2009-10-26 4 views
6

제네릭 메서드의 MethodInfo를 비 제네릭 형식으로 되돌리려면 어떤 인수를 Type.GetMethod에 전달해야하는지 알 수없는 작은 문제가 있습니다. 은 특히,이 유형 정의가 : 나는 여러 가지 시도 Type.GetMethod에서 소요 한generic이 아닌 .NET 유형에서 일반 메소드의 MethodInfo를 얻는 방법은 무엇입니까?

public static class A 
{ 
    public static B F<T>(bool dummy) 
    { 
    } 
    public static B F<T>(IEnumerable<T> arg) 
    { 
    ... 
    } 
} 

을, 그러나 아무도는 F 방법의 MethodInfo를 반환하지 않을 것이다.

Type.GetMethods 또는 Type.FindMember를 호출 할 수 있다는 것을 알고 있지만 Type.GetMethod에 관심이 있습니다.

아이디어가 있으십니까?

감사합니다.

편집

사실, 내 코드는 좀 더 복잡하다. 제네릭 메서드가 오버로드되어 있으므로 함수 이름과 함께 Type.GetMethod를 사용할 수 없습니다. 나는 이러한 변형을 시도 :

typeof(A).GetMethod("F", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null) 
typeof(A).GetMethod("F`1", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null) 
typeof(A).GetMethod("F[T]", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null) 
typeof(A).GetMethod("F[[T]]", BindingFlags.Static | BindingFlags.Public, null, new Type[]{ typeof(IEnumerable<>) }, null) 
+0

시도한 코드를 게시하십시오. –

+0

내 질문이 변경되었습니다. 감사. – mark

+0

@ 마크 대답을 바꿨습니다. –

답변

6

GetMethod에 전달할 IEnumerable<> 매개 변수는 특수하지 않습니다. 실제로는 IEnumerable<T>이며 검색하려는 방법에 따라 T이 지정됩니다. 그러나 메소드에 대한 참조가 없으므로 MethodInfo.GetGenericArguments()을 통해 T을 얻을 수 없습니다. 우리는 여전히 메소드를 검색하려고합니다.

리플렉션 API가 부족한 곳입니다. 오버로드 된 메서드를 구별 할 수있는 오버로드가 없으며 하나는 일반적인 메서드입니다.

이렇게 말하면, Type.GetMethods()을 사용하고 선택한 술어로 결과를 필터링해야합니다. 관심있는 방법을 얻으려면 다음을 수행하십시오.

void getMethod() 
{ 
    typeof(A).GetMethods().Where(m => 
     m.IsGenericMethod && 
     m.GetParameters()[0].ParameterType.GetGenericTypeDefinition() 
      == typeof(IEnumerable<>)); 
} 

N.B. GetGenericTypeDefinition() 호출이 필요하다는 것을 확인하지 못했습니다. 당신은 그것을 생략 할 수 있습니다. 당신이 타입 A<T>A<>으로 변형하고 있지만, 런타임은 이미 그 형태로 여러분에게 줄 것입니다.

5

(해명 질문에 대한 응답으로 업데이트) 다음 있기 때문에,

GetMethod (예를 들어, 한 줄.) 사용 방법에 대한 핸들을 얻을 수있는 방법이 없습니다 메소드를 정의하기위한 일반 데이터는 검사 할 메소드가있을 때까지 사용할 수 없습니다.

MethodInfo[] methods = typeof(A).GetMethods(BindingFlags.Static | BindingFlags.Public); 
MethodInfo genericMethod = methods.Where(m=>m.IsGenericMethod).First(m=>m.ContainsGenericParameters); 
genericMethod = genericMethod.GetGenericMethodDefinition(); 
  1. 일반적인 매개 변수가있는 방법 찾기 방법 받기 (하나만을 가지고 가정 - 두 개 이상의를 추가하는 경우, 이것은 좀 더 강력 할 필요)
  2. 가 받기 제네릭 methodinfo
+1

고마워,하지만 나는 그 질문에 아주 미끄러 져 갔다. 더 정확한 것으로 변경했습니다. – mark

+0

고맙습니다.하지만 제 질문에서 GetMethods 또는 FindMember를 사용하여 작업하는 방법을 알고 있습니다. 나는 GetMethod에 특별한 관심을 가지고 있습니다. 왜냐하면 그것은 또한 일을해야하기 때문입니다. 그러나 그렇지 않아서 저를 귀찮게합니다. – mark

+0

@Mark 방법을 정의 할 수있는 일반 데이터는 검사 할 방법이 없을 때까지 사용할 수 없으므로이를 수행 할 방법이 없습니다. –

관련 문제