2009-03-08 12 views
1

리플렉션을 사용하여 오버로드 된 메서드를 호출해야합니다. 다음과 같이 내 클래스 : 내가 호출하려고리플렉션을 사용하여 제네릭 오버로드 된 메서드 호출

public static Transformer 
{ 
    //Overloaded method with generics parameter. First Transform Method 
    public static TranformerResult Transform<T>(object [] entities, 
     List<T> dataContract) where T:class 
    { 
     return transformerResult; 
    } 

    //Overloaded method without generics parameter. Second Transform Method 
    public static TranformerResult Transform(object entities, 
     Type dataContract) 
    { 
     return transformerResult; 
    } 
} 

public class TransformerResult 
{ 
    public List<T> GetTypes<T>() where T:class 
    { 
    } 
} 

먼저 구문 아래로 방법을 변환 :

GetMethod(“Transform”,(BindingFlags.Static | BindingFlags.Public), 
    null, new Type[](){typeof(object[]),typeof(List<Type>}, null) 

하지만이 방법을 변환 초 얻고있다.

내 의도는 transformerResult에서 GetType을 호출하는 것입니다. transformerResult는 첫 번째 변환 메소드 호출을 반환하는 객체입니다.

내 의도를 달성하기 위해 어느 누구도 C# 코드를 작성할 수 있습니까? 이

감사합니다, Mahir

답변

1

작동하지 않는 : typeof(List<>) 당신은 당신이하는 일에 조금 까다로운해야하는거야, 나는이 게시물에해야 할 일을했을 것과 비슷한 : 기본적으로 http://www.aaron-powell.com/posts/2010-04-08-reflection-and-generics.html

LINQ를 사용하여 모든 Transform 메서드 컬렉션을 검색하면 원래 원하는 메서드 만 다시 가져올 수 있습니다.

+1

게시 한 링크가 끊어졌습니다. –

+0

@PeterO. 링크가 고정되어있다. –

0

GetMethod()을 호출 할 때 배열의 두 번째 유형이 혼란 스럽다고 생각합니다. 이러한 메서드가 포함 된 클래스의 Type 클래스의 인스턴스를 가져 오면 해당 클래스 인스턴스를 만드는 데 사용 된 실제 제네릭 매개 변수 (두 번째 코드 샘플을 기준으로 Type 인 모양)가 포함되지 않습니다. 대신, 하나의 일반적인 매개 변수가 있음을 알고 있습니다.

현재 내 컴파일러가 없으므로 불행히도이 문제를 해결할 수는 없지만 두 번째 매개 변수는 typeof(List<T>)과 동일하게 지정하려고합니다. System.Collections.Generic.List.GetType()라고 부르지 만, 나는 긍정적이지 않다).

그래도 작동하지 않는다면 생각해 볼 수있는 유일한 방법은 Type.GetMethods(BindingFlags.Static | BindingFlags.Public)으로 전화를 걸어 직접 배열을 검색하는 것입니다.

3

문제가 발생하는 이유는 찾고있는 특정 방법이 일반적이라는 것입니다. 메서드의 유형 중 하나는 메서드의 제네릭 매개 변수를 기반으로합니다. 이렇게하면 잡을 수 있습니다. generic 매개 변수는 메서드에 연결되어 있으므로 메서드 자체가있을 때까지 메서드의 형식 배열을 제대로 만들 수 없습니다.

이 특정 시나리오에 대한 한 가지 해결책은 첫 번째 일반적인 방법을 사용하는 것입니다.

var method = typeof(Transformer).GetMethods().Where(x => x.IsGenericMethod).First(); 
관련 문제