我正在使用反射从我的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]'.
答案 0 :(得分:2)
这似乎是你应该做的事情,不是吗?但这是不允许的,这就是原因。
EntityCollection<T>
是可写的,因此如果将EntityCollection<Derived>
强制转换为EntityCollection<Base>
,则可以将Base对象插入集合中。这意味着您现在拥有的课程实例并非衍生出来,并且不是EntityCollection<Derived>
中Derived的孩子。然后怎样呢?期望Derived的EntityCollection<Derived>
上的迭代器会以各种令人兴奋的方式失败。