Digamos que tengo un miembro genérico en una clase o método, entonces:
public class Foo<T>
{
public List<T> Bar { get; set; }
public void Baz()
{
// get type of T
}
}
Cuando una instancia de la clase, la T
convierte MyTypeObject1
, por lo que la clase tiene una propiedad de lista genérica: List<MyTypeObject1>
. Lo mismo se aplica a un método genérico en una clase no genérica:
public class Foo
{
public void Bar<T>()
{
var baz = new List<T>();
// get type of T
}
}
Me gustaría saber qué tipo de objetos contiene la lista de mi clase. Entonces, ¿la propiedad de la lista llamada Bar
o la variable local baz
contiene qué tipo de T
?
No puedo hacerlo Bar[0].GetType()
, porque la lista puede contener cero elementos. ¿Cómo puedo hacerlo?
object
,IList
o similar, pero esta podría ser la respuesta correcta.typeof
es. Si quieres saber el tipo de T, solo usatypeof(T)
:)typeof()
con un parámetro genérico. ¿Tienes algún ejemplo donde no funcionaría? ¿O estás confundiendo parámetros de tipo y referencias?(Nota: Estoy asumiendo que todo lo que sabe es
object
oIList
o similares, y que la lista podría ser cualquier tipo en tiempo de ejecución)Si sabes que es un
List<T>
, entonces:Otra opción es mirar el indexador:
Usando nuevo TypeInfo:
fuente
Con el siguiente método de extensión puede escapar sin reflexión:
O más general:
Uso:
fuente
T
en tiempo de compilación. En cuyo caso, realmente no necesita ningún código.ItemType
Tratar
fuente
GetGenericArguments
método devuelve un objeto ArrayType
, del cual debe analizar la posición del tipo genérico que necesita. Tales comoType<TKey, TValue>
: necesitaríaGetGenericArguments()[0]
obtener elTKey
tipo yGetGenericArguments()[1]
obtener elTValue
tipoEso es trabajo para mi. Donde myList es algún tipo de lista desconocida.
fuente
<T>
)List
ya es una implementación deIEnumerable
, por lo que el elenco no parece agregar nada. Pero gracias, es una buena solución.Si no necesita toda la variable Tipo y solo desea verificar el tipo, puede crear fácilmente una variable temporal y usar su operador.
fuente
Puede usar este para el tipo de retorno de la lista genérica:
fuente
Considere esto: lo uso para exportar 20 listas escritas de la misma manera:
fuente
new T();
haría lo mismo que(T)Activator.CreateInstance(typeof(T));
. Requiere que agreguewhere T : new()
a la definición de clase / función, pero si desea crear objetos, debe hacerlo de todos modos.GetType
a unaFirstOrDefault
entrada que resulta en una posible excepción de referencia nula. Si está seguro de que devolverá al menos un elemento, ¿por qué no utilizarloFirst
?Utilizo este método de extensión para lograr algo similar:
Lo usas así:
Esto no es exactamente lo que está buscando, pero es útil para demostrar las técnicas involucradas.
fuente
El
GetGenericArgument()
método debe establecerse en el Tipo base de su instancia (cuya clase es una clase genéricamyClass<T>
). De lo contrario, devuelve un tipo [0]Ejemplo:
fuente
Puede obtener el tipo de "T" de cualquier tipo de colección que implemente IEnumerable <T> con lo siguiente:
Tenga en cuenta que no admite tipos de colección que implementen IEnumerable <T> dos veces, p. Ej.
Supongo que podría devolver una variedad de tipos si necesita soportar esto ...
Además, es posible que también desee almacenar en caché el resultado por tipo de colección si lo hace mucho (por ejemplo, en un bucle).
fuente
fuente
Usando la solución de 3dGrabber:
fuente
Si desea conocer el tipo subyacente de una propiedad, intente esto:
fuente
Así es como lo hice
Entonces llámalo así
O
fuente
Tipo:
fuente
SingleOrDefault()
También lanzaInvalidOperationException
cuando hay dos o más elementos.