如何在C#中确定集合中对象的类型

时间:2010-08-21 18:13:46

标签: c# entity-framework reflection

我试图在C#中使用Reflection来确定运行时集合属性中对象的类型。这些对象是实体框架生成的实体:

Type t = entity.GetType();
PropertyInfo [] propInfo = t.GetProperties();
foreach(PropertyInfo pi in propInfo)
{
    if (pi.PropertyType.IsGenericType)
    {
        if (pi.PropertyType.GetGenericTypeDefinition() 
            == typeof(EntityCollection<>))   
        //  'ToString().Contains("EntityCollection"))'  removed d2 TimWi's advice
        //
        //  --->  this is where I need to get the underlying type
        //  --->  of the objects in the collection :-)
        // etc.
    }
}

如何识别集合所持有的对象类型?

编辑:更新上面的代码,首先添加.IsGenericType查询以使其正常工作

1 个答案:

答案 0 :(得分:3)

您可以使用GetGenericArguments()来检索集合类型的泛型参数(例如,对于EntityCollection<string>,泛型参数为string)。由于EntityCollection<>总是有一个泛型参数,GetGenericArguments()将始终返回单个元素数组,因此您可以安全地检索该数组的第一个元素:

if (pi.PropertyType.IsGeneric &&
    pi.PropertyType.GetGenericTypeDefinition() == typeof(EntityCollection<>))
{
    // This is now safe
    var elementType = pi.PropertyType.GetGenericArguments()[0];

    // ...
}