Как получить фактический тип T в общем списке во время выполнения с использованием отражения?Получить фактический тип T в общем списке <T>
ответ
Это зависит от того, что именно вы спрашиваете:
При написании кода внутри общего типа
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];
BTW - это будет использовать GetGenericTypeDefinition(), если «myList» не является общим типом ... Если вы собираетесь включить проверку ошибок, вы также должны включить проверку IsGenericType. –
Хороший улов, спасибо. – Timwi
Вы можете использовать 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");
}
Не очень полезно: вы можете передавать только объект, для которого вы уже знаете тип во время компиляции. – Timwi
@Timwi - Я могу думать о дюжине мест, это полезно, просто потому, что у вас есть 'T' во время компиляции, не означает, что вы это знаете (общие ограничения, например). Там есть несколько способов сделать это, например. 'ElementType' на' IQueryable
@Timwi: Хотя я поставил это как очень простой сценарий использования - он полностью работает и от отражения. Вызов GetGenericArguments является основным способом, через отражение, чтобы вытащить это. Конечно, в этом случае я мог бы просто вернуть typeof (T) и был сделан с ним - но я не знаю, как OP получает «Список
typeof (T)
или
typeof (T).UnderlyingSystemType
Новое решение старой проблемы по dynamic
void Foo(){
Type type GetTypeT(data as dynamic);
}
private static Type GetTypeT<T>(IEnumerable<T> data)
{
return typeof(T);
}
- 1. Чтение и изменение объектов в общем списке <T>
- 2. Петли по значениям свойств в общем списке <T>
- 3. Получить скрытый тип в списке <T> через отражение?
- 4. Метод расширения, SumIf в общем списке <T>
- 5. Есть ли способ получить тип объектов, хранящихся в общем списке?
- 6. Использование <?> или <T> в общем методе
- 7. NullPointerException в общем списке
- 8. C# GetType(): код, как получить тип T в списке <T> без фактических элементов?
- 9. Получить значение первого свойства в общем списке
- 10. в общем конвертировать из boost :: variant <T> в тип
- 11. Проверка наличия в списке <Tuple<T, T>
- 12. Получить фактический тип из массива
- 13. C# получить тип Generic <T> дал T
- 14. Получить фактический тип параметра общего объекта
- 15. Получить фактический тип из переменной типа
- 16. тип системы.Collection <T>
- 17. рабочий метод выбора linq в общем списке T?
- 18. Джексон читает json в общем списке
- 19. Получить конкретный тип объекта из списка <T>
- 20. Сравнение элементов в общем списке
- 21. Как получить элементы сравнения в общем списке
- 22. Как получить последний объект в общем списке?
- 23. Как получить фактический тип класса в javascript
- 24. Как получить фактический тип значения в jQuery?
- 25. Каков фактический тип переменной «t» в Switch GoLang Type?
- 26. Получить тип элементов в списке, полученных из списка <T> в C#
- 27. Переопределение в общем списке
- 28. Многопоточность в общем списке
- 29. Тип импликации в общем методе
- 30. Как получить то, что НЕ в списке <T>
Что делает ваш текущий вид кода, как? Немного контекста поможет –
возможный дубликат [C# общий список как получить тип T?] (Http://stackoverflow.com/questions/557340/c-sharp-generic-list-t-how-to -get-the-type-of-t) –
nawfal