Вызвать перегруженный метод обобщенных элементов, используя отражение - PullRequest
1 голос
/ 08 марта 2009

Мне нужно вызвать перегруженный метод, используя отражение. Мои занятия, как показано ниже:

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. TransformerResult - это объект, который возвращает вызов первого метода преобразования.

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

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

Ответы [ 3 ]

3 голосов
/ 08 марта 2009

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

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

var method = typeof(Transformer).GetMethods().Where(x => x.IsGenericMethod).First();
1 голос
/ 08 марта 2009

Если это не работает: typeof(List<>) вам нужно будет немного хитрить с тем, что вы делаете, подобно тому, что я делал с этим постом: http://www.aaron -powell.com / posts / 2010-04-08-отражательные и-generics.html

По сути, используя LINQ для поиска в коллекции всех Transform методов, вы не можете получить обратно только тот, который вам нужен изначально.

0 голосов
/ 08 марта 2009

Я думаю, что второй тип в массиве типов при вызове GetMethod() сбивает с толку. Если вы получаете экземпляр класса Type класса, содержащего эти методы, это не включает фактический универсальный параметр, использованный для создания этого экземпляра класса (который выглядит как Type, на основе вашего второго примера кода ). Вместо этого он просто знает, что у него есть один общий параметр.

У меня нет компилятора перед моим текущим, поэтому, к сожалению, я не могу попробовать это, но я бы попытался указать эквивалент typeof(List<T>) для второго параметра (вы могли бы получить это по телефону System.Collections.Generic.List.GetType(), но я не уверен).

Если это не сработает, единственный другой вариант, о котором я могу подумать, - это вызвать Type.GetMethods(BindingFlags.Static | BindingFlags.Public) и самостоятельно выполнить поиск по массиву.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...