如何找出零长度集合的元素类型?

时间:2014-09-28 16:44:33

标签: c# entity-framework

我正在编写一个通用的保存对象图方法。

如果我的对象图包含一个集合,则可能已删除该集合的所有元素。

为了保留删除,我需要知道该集合要包含的实体类型。

navProps = GetNavigationProperties(originalEntity);
foreach (PropertyInfo navProp in navProps)
{

    Type propertyType = navProp.PropertyType;

    bool isCollection = propertyType.GetInterfaces().Any(x => x == typeof(IEnumerable)) &&
                                            !(propertyType == typeof(string));

   object obj = navProp.GetValue(item);  

   if (isCollection) 
   {
       // I need to know what type the elements in the collection so I can retrieve the ones that might need deleting.
   }

}

1 个答案:

答案 0 :(得分:1)

您有两种情况:要么只有IEnumerable,那么您只能知道元素属于object类型。这就是您的代码目前所做的事情。

第二种可能性是您有一个强类型IEnumerable<T>,在这种情况下,您可以执行以下操作:

var enumerableTInterface = propertyType
    .GetInterfaces()
    .FirstOrDefault(x => x.IsGenericType && x.GetGenericTypeDefinition()
                                            == typeof(IEnumerable<>));

bool isStronglyTypedCollection = enumerableTInterface != null;

if (isStronglyTypedCollection)
{
    var elementType = enumerableTInterface.GetGenericArguments()[0];
    //...