yo sepa this pregunta, y es el seguimiento, y también this uno, pero no puedo ponerlos juntos de una manera que ayudará a hacer lo que quiero hacer:Cómo detectar si T es IEnumerable <T2>, y si es así, ¿obtener tipo de T2?
tengo una tipo genérico, y quiero comprobar que T es un struct
O si implementa IEnumerable<T2>
, entonces me gustaría comprobar que T2 es un struct
.
Hasta ahora, Tengo que aquí ('scuse el código rudimentario, esto es experimental):
private class TestClass<T>
{
public TestClass()
{
Type type = typeof(T);
//(detecting T == IEnumerable<something> ommitted for clarity)
Type enumerableType = type.GetInterfaces()
.Where(t => t.IsGenericType)
.Select(t => t.GetGenericTypeDefinition())
.Where(t => t == typeof(IEnumerable<>))
.FirstOrDefault();
if(enumerableType != null)
{
Type enumeratedType = type.GetGenericArguments().First();
if(!enumeratedType.IsValueType) //throw etc...
}
}
}
El problema que tengo es que es enumerableType
IEnumerable<>
, por lo que el enumeratedType
sale como T
, no lo que sea que haya pasado (por ejemplo, new TestClass<int[]>()
).
Gracias, funciona, y confiaré en ti para los casos extremos (un poco fuera de mi alcance en los comentarios sobre la respuesta de dtb). – Benjol
@Benjol: Dependiendo de la versión de .NET que esté utilizando, es posible que también desee una comprobación explícita de las matrices, ya que [en .NET 2.0 'GetInterfaces' se rompió en los tipos de matriz] (https://connect.microsoft. com/VisualStudio/feedback/details/93995/getinterfaces-bug-for-typed-array). dtb tiene esa prueba en particular correcta ... 'if (type.IsArray) return type.GetElementType();'. –