1

リフレクションを使用して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]'.
4

1 に答える 1

2

できるはずのことのようですね。しかし、それは許可されていません。その理由は次のとおりです。

EntityCollection<T>は書き込み可能であるため、をにキャストするEntityCollection<Derived>と、EntityCollection<Base>Baseオブジェクトをコレクションに挿入できます。つまり、Derivedではなく、Derivedの子ではないクラスのインスタンスがありますEntityCollection<Derived>。では、どうしますか?EntityCollection<Derived>Derivedがあらゆる種類のエキサイティングな方法で失敗することを期待するイテレータ。

于 2012-07-17T17:45:43.520 に答える