首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法将EntityCollection<Derived>类型的对象强制转换为EntityCollection<Base>

无法将EntityCollection<Derived>类型的对象强制转换为EntityCollection<Base>
EN

Stack Overflow用户
提问于 2012-07-17 17:37:30
回答 1查看 1.9K关注 0票数 1

我使用反射从我的EntityCollection<Derived>域实体获取EF4属性。示例实体可能有许多集合,这些集合包含具有公共基的类型。GetValue()返回一个object,但我需要将它转换为EntityCollection<Base>,甚至是IEnumerable<Base>。但是怎么做呢?(哎呀,对IEnumerable的转换就像C#4那样起作用)

示例模型

代码语言:javascript
复制
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,我不能将反射的对象返回到可用的表单中。

方法

代码语言:javascript
复制
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;
}

真实世界误差

代码语言:javascript
复制
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]'.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-07-17 17:45:43

这似乎是你应该能做的事,不是吗?但这是不允许的,这就是为什么。

EntityCollection<T>是可写的,因此如果将EntityCollection<Derived>强制转换为EntityCollection<Base>,则可以将基本对象插入到集合中。这意味着您现在有一个类的实例,这个类不是派生的,也不是EntityCollection<Derived>中派生的一个子实例。然后呢?EntityCollection<Derived>上的迭代器期望派生出的迭代器将以各种令人兴奋的方式失败。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11527847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档