[英]How to get the type contained in a collection through reflection
在我的代码的某些部分,我传递了T
类型的对象集合。 我不知道我将通过哪个具体的集合,除了它的IEnumerable
。
在运行时,我需要找出T是哪种类型(例如System.Double
, System.String
等...)。
有什么方法可以找到它吗?
更新 :我应该澄清一下我正在工作的背景(一个Linq提供者)。
我的函数有如下的签名,我将集合的类型作为参数:
string GetSymbolForType(Type collectionType)
{
}
从collectionType
有没有办法获取包含的对象类型?
来自Matt Warren的博客 :
internal static class TypeSystem {
internal static Type GetElementType(Type seqType) {
Type ienum = FindIEnumerable(seqType);
if (ienum == null) return seqType;
return ienum.GetGenericArguments()[0];
}
private static Type FindIEnumerable(Type seqType) {
if (seqType == null || seqType == typeof(string))
return null;
if (seqType.IsArray)
return typeof(IEnumerable<>).MakeGenericType(seqType.GetElementType());
if (seqType.IsGenericType) {
foreach (Type arg in seqType.GetGenericArguments()) {
Type ienum = typeof(IEnumerable<>).MakeGenericType(arg);
if (ienum.IsAssignableFrom(seqType)) {
return ienum;
}
}
}
Type[] ifaces = seqType.GetInterfaces();
if (ifaces != null && ifaces.Length > 0) {
foreach (Type iface in ifaces) {
Type ienum = FindIEnumerable(iface);
if (ienum != null) return ienum;
}
}
if (seqType.BaseType != null && seqType.BaseType != typeof(object)) {
return FindIEnumerable(seqType.BaseType);
}
return null;
}
}
myCollection.GetType().GetGenericArguments()
将返回args类型的数组。
Type t = null
foreach(object o in list)
{
o.GetType();
}
会告诉你对象的类型。
然后你应该测试你想要的类型:
if(t == typeof(myClass))
{
dosomething();
}
else if (t == typeof(myOtherClass))
{
dosomethingelse();
}
我使用动态很多,这是一个不时出现的问题。
马特戴维斯钉了它但你需要索引:)
public static void PopulateChildCollection<T>(T currentObject, string singlePropertyName)
{
dynamic currentObjectCollection = ReflectionTools.GetPropertyValue(currentObject, singlePropertyName);
Type collectionType = currentObjectCollection.GetType().GetGenericArguments()[0];
类型将是您所期望的,它是集合中包含的对象的类型,而不是它周围的任何泛型类型。
你不能只使用t.GetType()来做到这一点。
为什么不直接实现IEnumerable<T>
? 例如:
public void MyFunc<T>(IEnumerable<T> objects)
除此之外,您最好使用is
或.GetType
检查每个单独对象的类型,而不是尝试从容器本身处理它。
如果这不是一个选项,你真的需要知道基本容器的类型,你基本上必须检查使用is
看它实现了什么接口(EG: IList<int>
等)。 赔率是你的数组的类型将是一个泛型,这意味着尝试从它的名称返回到它的数据类型将是非常混乱。
嗯,我在这里很晚,但不应该这样做:
public static bool ThatCollectionIsOfType<T>(IEnumerable<T> collection, Type got)
{
if (**typeof(T)** == got) //this line should be good to go...
{
return true;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.