繁体   English   中英

如何通过反射获取集合中包含的类型

[英]How to get the type contained in a collection through reflection

在我的代码的某些部分,我传递了T类型的对象集合。 我不知道我将通过哪个具体的集合,除了它的IEnumerable

在运行时,我需要找出T是哪种类型(例如System.DoubleSystem.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM