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 Tconvierte 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 Baro la variable local bazcontiene qué tipo de T?
No puedo hacerlo Bar[0].GetType(), porque la lista puede contener cero elementos. ¿Cómo puedo hacerlo?

object,IListo similar, pero esta podría ser la respuesta correcta.typeofes. 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
objectoIListo 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
Ten tiempo de compilación. En cuyo caso, realmente no necesita ningún código.ItemTypeTratar
fuente
GetGenericArgumentsmé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 elTKeytipo yGetGenericArguments()[1]obtener elTValuetipoEso es trabajo para mi. Donde myList es algún tipo de lista desconocida.
fuente
<T>)Listya 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.GetTypea unaFirstOrDefaultentrada 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 lanzaInvalidOperationExceptioncuando hay dos o más elementos.