リフレクションを使用してEntityCollection<Derived>
、EF4 ドメイン エンティティからプロパティを取得しています。エンティティの例には、共通のベースを持つ型を保持する多くのコレクションがある場合があります。GetValue()
を返しますが、それをまたはobject
に変換する必要があります。しかし、どのように?(おっと、IEnumerable へのキャストは C#4 で機能します)EntityCollection<Base>
IEnumerable<Base>
モデル例
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]'.