2009-03-08 3 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 
    { 
    } 
} 

Я пытался вызвать первый Transform метод с ниже синтаксис:

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

Но я получаю второй метод преобразования.

Мое намерение - вызвать GetType на transformerResult. TransformResult - это объект, который возвращает вызов первого метода преобразования.

Может ли кто-нибудь помочь мне написать код C# для достижения моего намерения? не

Спасибо, Махир

ответ

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

Причина, по которой вы столкнулись с проблемой, заключается в том, что конкретный метод, который вы ищете, является общим. Один из типов метода основан на общем параметре метода. Это дает вам немного улова 22. Общий параметр привязан к методу, поэтому вы не можете правильно построить массив типов для метода до тех пор, пока не получите сам метод.

Одним из решений для этого конкретного сценария является просто захват первого общего метода.

var method = typeof(Transformer).GetMethods().Where(x => x.IsGenericMethod).First();