Допустим, у меня есть универсальный член в классе или методе, поэтому:
public class Foo<T>
{
public List<T> Bar { get; set; }
public void Baz()
{
// get type of T
}
}
Когда я создаю экземпляр класса, то T
становится MyTypeObject1
, так что класс имеет общий список имущества: List<MyTypeObject1>
. То же самое относится к универсальному методу в неуниверсальном классе:
public class Foo
{
public void Bar<T>()
{
var baz = new List<T>();
// get type of T
}
}
Я хотел бы знать, какой тип объектов содержится в списке моего класса. Так называется свойство списка Bar
или локальная переменная baz
, какой тип содержит T
?
Я не могу сделать Bar[0].GetType()
, потому что список может содержать ноль элементов. Как мне это сделать?
object
,IList
или похожий - но это вполне может быть правильный ответ.typeof
. Если вы хотите узнать тип T, просто используйтеtypeof(T)
:)typeof()
с универсальным параметром. У вас есть пример, где это не сработает? Или вы путаете параметры типа и ссылки?(примечание: я предполагаю, что все, что вы знаете, является
object
илиIList
или похожим, и что список может быть любого типа во время выполнения)Если вы знаете, что это
List<T>
, то:Другой вариант - посмотреть на индексатор:
Используя новое TypeInfo:
источник
С помощью следующего метода расширения вы можете обойтись без размышлений:
Или более общий:
Применение:
источник
T
во время компиляции. В этом случае вам вообще не нужен код.ItemType
Пытаться
источник
GetGenericArguments
метод возвращает объект ArrayType
, из которого вам необходимо проанализировать положение необходимого вам универсального типа. НапримерType<TKey, TValue>
: вам нужноGetGenericArguments()[0]
получитьTKey
тип иGetGenericArguments()[1]
получитьTValue
типЭто работа для меня. Где myList - это какой-то неизвестный список.
источник
<T>
)List
уже является реализациейIEnumerable
, так что, похоже, актеры ничего не добавляют. Но спасибо, это хорошее решение.Если вам не нужна вся переменная Type и вы просто хотите проверить тип, вы можете легко создать временную переменную и использовать оператор is.
источник
Вы можете использовать это для типа возврата универсального списка:
источник
Учтите это: я использую его для экспорта 20 печатных списков таким же образом:
источник
new T();
чтобы сделать то же самое, что и(T)Activator.CreateInstance(typeof(T));
. Это требует, чтобы вы добавилиwhere T : new()
определение класса / функции, но если вы хотите создавать объекты, это должно быть сделано в любом случае.GetType
наFirstOrDefault
вход , в результате потенциального эталонного нулевого исключения. Если вы уверены, что он вернет хотя бы один элемент, почему бы не использоватьFirst
вместо этого?Я использую этот метод расширения для достижения чего-то похожего:
Вы используете это так:
Это не совсем то, что вы ищете, но это полезно для демонстрации используемых методов.
источник
GetGenericArgument()
Метод должен быть установлен на базовый тип экземпляра (класс которого является общий классmyClass<T>
). В противном случае он возвращает тип [0]Пример:
источник
Вы можете получить тип «T» из любого типа коллекции, который реализует IEnumerable <T>, с помощью следующего:
Обратите внимание, что он не поддерживает типы коллекций, которые реализуют IEnumerable <T> дважды, например
Я полагаю, вы могли бы вернуть массив типов, если вам нужно это поддерживать ...
Кроме того, вы также можете кэшировать результат для каждого типа коллекции, если вы делаете это много (например, в цикле).
источник
источник
Используя решение 3dGrabber:
источник
Если вы хотите знать базовый тип свойства, попробуйте это:
источник
Вот как я это сделал
Тогда назови это так
ИЛИ
источник
Тип:
источник
SingleOrDefault()
также бросает,InvalidOperationException
когда есть два или более элемента.