无法将EntityCollection <derived>类型的对象强制转换为EntityCollection <base /> </derived>

时间:2012-07-17 17:37:30

标签: c# entity-framework reflection casting polymorphism

我正在使用反射从我的EF4域实体获取EntityCollection<Derived>属性。示例实体可以具有许多集合,其包含具有共同基础的类型。 GetValue()会返回object,但我需要将其转换为EntityCollection<Base>甚至IEnumerable<Base>。但是怎么样? (oops,强制转换为IEnumerable在C#4中起作用)

示范模型

public class Derived : Base { ... }
public class AnotherDerived : Base { ... }
public class Example : Base
{
    public virtual ICollection<Derived> Items { get; set; }
    public virtual ICollection<AnotherDerived> OtherItems { get; set; }
}

我很难理解转换和多态性。我认为我能够成功完成此操作,并将DbSet<Derived>反映到IQueryable<Base>。但是对于EntityCollection,我无法将反射的对象恢复为可用的形式。

方法

public static List<T> GetCollectedEntities<T>(this BaseEntity entity)
    where T : BaseEntity
{
    var result = new List<T>();
    foreach (var c in GetCollections<T>(entity))
        foreach (var item in (EntityCollection<T>)c) //ERROR
            result.Add(item);
    return result;
}

public static List<object> GetCollections<T>(this BaseEntity entity)
    where T : BaseEntity
{
    var collections = new List<object>();
    var props = from p in entity.GetType().GetProperties()
                let t = p.PropertyType
                where t.IsGenericType
                && t.GetGenericTypeDefinition() == typeof(ICollection<>)
                let a = t.GetGenericArguments().Single()
                where a == typeof(T) || a.IsSubclassOf(typeof(T))
                select p;
    foreach (var p in props)
        collections.Add(p.GetValue(entity, null));
    return collections;
}

真实世界错误

Unable to cast object of type  
'System.Data.Objects.DataClasses.EntityCollection`1[HTS.Data.ServiceOrder]'  
to type  
'System.Data.Objects.DataClasses.EntityCollection`1[HTS.Data.IncomingServiceOrderBase]'.

1 个答案:

答案 0 :(得分:2)

这似乎是你应该做的事情,不是吗?但这是不允许的,这就是原因。

EntityCollection<T>是可写的,因此如果将EntityCollection<Derived>强制转换为EntityCollection<Base>,则可以将Base对象插入集合中。这意味着您现在拥有的课程实例并非衍生出来,并且不是EntityCollection<Derived>中Derived的孩子。然后怎样呢?期望Derived的EntityCollection<Derived>上的迭代器会以各种令人兴奋的方式失败。