0

一般的なリポジトリといくつかのエンティティ タイプの特定の実装で構成される BL があります (私の DAL は Entity Framework 5 モデルです)。リポジトリは、ほとんどすべての機能に System.Data.Entity.DbContext のメソッド Set() を使用します。エンティティ T の兄弟を取得するなどの式がいくつかありますが、これらは Set(Type entityType) の結果では機能しません。

ある時点で、非ジェネリック DbEntityEntry のインスタンスがあります。エンティティは Object 型です。GetType() を使用すると、適切なエンティティ タイプが取得されます。リポジトリの関数を使用して関連エンティティを取得したいことはわかっています。非ジェネリック DbEntityEntry からこれを行う方法はありますか。

私は試した:

public Repository(T entity)
{
    \\ Construction here
}

しかし、私は a を取得し、Repository<Object>への呼び出しはSet<Object>期待どおりに何も返しません。

これを行う方法を検索しましたが、空になりました。

4

4 に答える 4

2

このスレッドで George Mauer によって投稿されたこの例を見てください。.Net 4.0 以降が必要です。

dynamic DynamicCast(object entity, Type to)
{
    var openCast = this.GetType().GetMethod("Cast", BindingFlags.Static | BindingFlags.NonPublic);
    var closeCast = openCast.MakeGenericMethod(to);
    return closeCast.Invoke(entity, new[] { entity });
}
static T Cast<T>(object entity) where T : object
{
    return entity as T;
}

これを少し変更したバリアントを使用して、一致するRepositoryインスタンスを作成できます。

public static dynamic CreateRepository(object entiry, Type targetType)
{
    Type BaseType = typeof(Repository<>);   
    Type ConcreteType = BaseType.MakeGenericType(targetType);
    var Instance = Activator.CreateInstance(ConcreteType, entiry);

    return DynamicCast(Instance, ConcreteType);
}
于 2013-05-02T12:21:28.797 に答える
0

ジェネリック型にパラメーターのないコンストラクターを持たせることができれば、この問題はかなりエレガントに解決できます。

public Repository(T entity) where T : new()
{
    T foo = new T(); //that's it
}
于 2013-05-02T12:10:06.943 に答える
0

できるよ:

T entity = default(T);

これは、構造体とクラスだけでなく、T の値型の両方で機能します。T はクラスですが、パラメーターなしのコンストラクターが必要です。

于 2013-05-02T12:23:36.060 に答える