C # отражение: предоставление T для универсального метода - PullRequest
4 голосов
/ 26 января 2012

У меня нет опыта использования рефлексии и общих методов, вот два метода.Я думаю, вы понимаете, что я пытаюсь сделать.

public static T GetInHeaderProperty<T>() where T : new()
{
    dynamic result = new T();

    result.CompanyId = ConfigurationManager.AppSettings["CompanyId"];
    result.UserId = ConfigurationManager.AppSettings["UserId"];
    result.Password = ConfigurationManager.AppSettings["Password"];
    result.MessageId = ConfigurationManager.AppSettings["MessageId"];

    Type platformType = typeof(T).GetProperty("PlatformType").PropertyType;
    // Here is my problem, I can not compile my code because of this line
    result.PlatformType = (dynamic)GetPlatformType<platformType>();
    //-------------------------------------------------------------------

    return (T)result;
}

public static T GetPlatformType<T>() where T : struct
{
    string platform = System.Configuration.ConfigurationManager.AppSettings["Platform"];
    T value;
    if (Enum.TryParse(platform, out value))
        return value;
    else
        return default(T);
}

Я получаю следующую ошибку во время компиляции:

Имя типа или пространства имен 'platformType' не найдено (вы пропустили директиву using илиссылка на сборку?).

Как мне вызвать этот метод?

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 26 января 2012

GetPlatformType - это универсальный метод, но вместо передачи ему универсального параметра вы передаете ему объект Type, который описывает тип. Общий параметр T должен быть известен во время компиляции, а не передаваться во время выполнения.

Вы можете использовать перегрузку Enum.Parse, передав ей объект Type, но вам придется самостоятельно обернуть его в блок try / catch (без перегрузки TryParse).

2 голосов
/ 26 января 2012

Попробуйте использовать MakeGenericMethod .

Сначала необходимо получить MethodInfo для метода. Может быть, есть лучший способ использовать некоторые динамические вещи, но я обычно так и поступаю. Наконец, вам нужно позвонить Invoke .

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