Digamos que eu tenha um membro genérico em uma classe ou método, então:
public class Foo<T>
{
public List<T> Bar { get; set; }
public void Baz()
{
// get type of T
}
}
Quando eu instanciar a classe, o T
torna-se MyTypeObject1
, por isso, a classe tem uma propriedade lista genérica: List<MyTypeObject1>
. O mesmo se aplica a um método genérico em uma classe não genérica:
public class Foo
{
public void Bar<T>()
{
var baz = new List<T>();
// get type of T
}
}
Gostaria de saber que tipo de objetos a lista da minha classe contém. Portanto, a propriedade list chamada Bar
ou a variável local baz
, contém que tipo de T
?
Não posso Bar[0].GetType()
, porque a lista pode conter zero elementos. Como eu posso fazer isso?
object
,IList
ou similar - mas isso poderia muito bem ser a resposta certa.typeof
é. Se você quiser saber o tipo de T, basta usartypeof(T)
:)typeof()
com um parâmetro genérico. Você tem algum exemplo em que não funcionaria? Ou você está confundindo parâmetros e referências de tipo?(observação: estou assumindo que tudo o que você sabe é
object
ouIList
ou semelhante, e que a lista pode ser de qualquer tipo em tempo de execução)Se você sabe que é um
List<T>
, então:Outra opção é olhar para o indexador:
Usando o novo TypeInfo:
fonte
Com o seguinte método de extensão, você pode fugir sem reflexão:
Ou mais geral:
Uso:
fonte
T
em tempo de compilação. Nesse caso, você realmente não precisa de nenhum código.ItemType
Tentar
fonte
GetGenericArguments
método retorna um objeto ArrayType
, do qual você precisa analisar a posição do Tipo Genérico necessário. Tais comoType<TKey, TValue>
: você precisaGetGenericArguments()[0]
para obterTKey
o tipo eGetGenericArguments()[1]
para obterTValue
tipoIsso é trabalho para mim. Onde myList é algum tipo de lista não conhecido.
fonte
<T>
)List
já é uma implementação deIEnumerable
, portanto, o elenco não parece adicionar nada. Mas obrigado, é uma boa solução.Se você não precisa da variável Type inteira e apenas deseja verificar o tipo, pode criar facilmente uma variável temp e usar o operador is.
fonte
Você pode usar este para retornar o tipo de lista genérica:
fonte
Considere o seguinte: eu o uso para exportar a lista de 20 tipos da mesma maneira:
fonte
new T();
faria a mesma coisa que(T)Activator.CreateInstance(typeof(T));
. Requer que você adicionewhere T : new()
à definição de classe / função, mas se você quiser criar objetos, isso deve ser feito de qualquer maneira.GetType
umaFirstOrDefault
entrada que resulta em uma possível exceção de referência nula. Se você tem certeza de que ele retornará pelo menos um item, por que não usarFirst
?Eu uso esse método de extensão para realizar algo semelhante:
Você o usa assim:
Não é exatamente o que você está procurando, mas é útil para demonstrar as técnicas envolvidas.
fonte
O
GetGenericArgument()
método deve ser definido no Tipo Base da sua instância (cuja classe é uma classe genéricamyClass<T>
). Caso contrário, ele retornará um tipo [0]Exemplo:
fonte
Você pode obter o tipo de "T" de qualquer tipo de coleção que implemente IEnumerable <T> com o seguinte:
Observe que ele não suporta tipos de coleção que implementam IEnumerable <T> duas vezes, por exemplo
Suponho que você possa retornar uma matriz de tipos, se necessário, para suportar isso ...
Além disso, você também pode querer armazenar em cache o resultado por tipo de coleção, se estiver fazendo muito isso (por exemplo, em um loop).
fonte
fonte
Usando a solução do 3dGrabber:
fonte
Se você deseja conhecer o tipo subjacente de uma propriedade, tente o seguinte:
fonte
Foi assim que eu fiz
Então chame assim
OU
fonte
Tipo:
fonte
SingleOrDefault()
também lançaInvalidOperationException
quando há dois ou mais elementos.