有没有办法通过反射从IEnumerable<T>
中检索类型T
?
例如:
我有一个变量Child info;我想通过反射检索IEnumerable<Child>
的类型
发布于 2012-03-15 03:12:23
我只需要做一个扩展方法。这对我所做的一切都很有效。
public static Type GetItemType<T>(this IEnumerable<T> enumerable)
{
return typeof(T);
}
发布于 2013-07-18 10:13:20
我也遇到过类似的问题。选择的答案适用于实际情况。在我的例子中,我只有一个类型(来自PropertyInfo
)。
当类型本身是typeof(IEnumerable<T>)
而不是IEnumerable<T>
的实现时,选择的答案将失败。
在这种情况下,以下方法有效:
public static Type GetAnyElementType(Type type)
{
// Type is Array
// short-circuit if you expect lots of arrays
if (type.IsArray)
return type.GetElementType();
// type is IEnumerable<T>;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof (IEnumerable<>))
return type.GetGenericArguments()[0];
// type implements/extends IEnumerable<T>;
var enumType = type.GetInterfaces()
.Where(t => t.IsGenericType &&
t.GetGenericTypeDefinition() == typeof(IEnumerable<>))
.Select(t => t.GenericTypeArguments[0]).FirstOrDefault();
return enumType ?? type;
}
发布于 2009-05-25 12:27:14
如果你知道IEnumerable<T>
(通过泛型),那么只需要typeof(T)
就可以了。否则(对于object
或非通用IEnumerable
),请检查实现的接口:
object obj = new string[] { "abc", "def" };
Type type = null;
foreach (Type iType in obj.GetType().GetInterfaces())
{
if (iType.IsGenericType && iType.GetGenericTypeDefinition()
== typeof(IEnumerable<>))
{
type = iType.GetGenericArguments()[0];
break;
}
}
if (type != null) Console.WriteLine(type);
https://stackoverflow.com/questions/906499
复制相似问题