Получить фактический тип T в общем списке <T> - PullRequest
4 голосов
/ 11 сентября 2010

Как получить фактический тип T в общем списке во время выполнения, используя отражение?

Ответы [ 4 ]

8 голосов
/ 11 сентября 2010

Это зависит от того, что именно вы спрашиваете:

  • При написании кода внутри универсального типа Blah<T> как получить тип отражения T?

    Ответ: typeof(T)

  • У меня есть объект, который содержит List<T> для некоторого типа T.Как получить тип T с помощью отражения?

    Краткий ответ: myList.GetType().GetGenericArguments()[0]

    Длинный ответ:

    var objectType = myList.GetType();
    if (!objectType.IsGenericType() ||
        objectType.GetGenericTypeDefinition() != typeof(List<>))
    {
        throw new InvalidOperationException(
            "Object is not of type List<T> for any T");
    }
    var elementType = objectType.GetGenericArguments()[0];
    
2 голосов
/ 11 сентября 2010

Вы можете использовать Type.GetGenericArguments , чтобы вернуть тип T в List<T>.

Например, это вернет тип для любого List<T>, переданного в качестве аргумента:

Type GetListType(object list)
{
    Type type = list.GetType();
    if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(List<>))
        return type.GetGenericArguments()[0];
    else
        throw new ArgumentException("list is not a List<T>", "list");
}
1 голос
/ 11 сентября 2010
typeof (T)

или

typeof (T).UnderlyingSystemType
0 голосов
/ 30 ноября 2015

Новое решение старой проблемы по dynamic

void Foo(){
   Type type GetTypeT(data as dynamic);
}

private static Type GetTypeT<T>(IEnumerable<T> data)
{
    return typeof(T);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...