2010-09-11 3 views
4

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

+0

Что делает ваш текущий вид кода, как? Немного контекста поможет –

+0

возможный дубликат [C# общий список как получить тип T?] (Http://stackoverflow.com/questions/557340/c-sharp-generic-list-t-how-to -get-the-type-of-t) – nawfal

ответ

8

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

  • При написании кода внутри общего типа 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]; 
    
+0

BTW - это будет использовать GetGenericTypeDefinition(), если «myList» не является общим типом ... Если вы собираетесь включить проверку ошибок, вы также должны включить проверку IsGenericType. –

+0

Хороший улов, спасибо. – Timwi

2

Вы можете использовать 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"); 
} 
+0

Не очень полезно: вы можете передавать только объект, для которого вы уже знаете тип во время компиляции. – Timwi

+0

@Timwi - Я могу думать о дюжине мест, это полезно, просто потому, что у вас есть 'T' во время компиляции, не означает, что вы это знаете (общие ограничения, например). Там есть несколько способов сделать это, например. 'ElementType' на' IQueryable ', но не отклоняйте это как не полезное. –

+0

@Timwi: Хотя я поставил это как очень простой сценарий использования - он полностью работает и от отражения. Вызов GetGenericArguments является основным способом, через отражение, чтобы вытащить это. Конечно, в этом случае я мог бы просто вернуть typeof (T) и был сделан с ним - но я не знаю, как OP получает «Список » в первую очередь ... Это, как говорится, делает отражение на общих аргументах в общем методе, подобном этому, может быть полезна в некоторых ситуациях ... –

1
typeof (T) 

или

typeof (T).UnderlyingSystemType 
0

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

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

private static Type GetTypeT<T>(IEnumerable<T> data) 
{ 
    return typeof(T); 
} 
Смежные вопросы