2

私は現在、ビジネス ロジックで必要なフィールドを設定しようとしています。この場合は Lazy です。(はい、プロパティではありません。フィールドを設定する必要があります) ご覧のとおり、Lazy を Lazy に変換できないというエラーが表示されます。

1[System.Object]' cannot be converted to type 'BusinessLogic.Lazy「BusinessLogic.Lazy 1[BusinessLogic.ArtikelBLL] 」タイプのオブジェクト

この行を使用して、動的リポジトリを取得します。

dynamic repository = Activator.CreateInstance(typeof(GenericRepository<>).MakeGenericType(typeArgs));

次に、フィールドの値を設定しようとしましたが、失敗しました:

fInfo.SetValue(obj, Lazy.From(() => repository.GetDataById(id)));

私はそれをさまざまな方法で解決しようとしました。どういうわけかrepository.GetDataById(id)、探しているエンティティにキャストする必要があります。この場合、これは ArtikelBLL (これを通過できますpInfo.PropertyType) です。しかし、そう(ArtikelBLL)repository.GetDataById(id)することでオブジェクト指向のままではなくなります。誰でもこれで私を助けてもらえますか?

4

1 に答える 1

3

最も簡単な方法は、ラムダ内でキャストを使用することです。

fInfo.SetValue(obj, new Lazy<GenericBLL>(
    () => (ArtikelBLL) repository.GetDataById(id)));

やっぱりLazy<T>欲しいタイプですね。

編集:これを動的に実行しようとしている場合は、次のような汎用メソッドを作成することをお勧めします:

public Lazy<T> CreateLazyDataFetcher<T>(dynamic repository)
{
    return new Lazy<T>(() => (T) repository.GetDataById(id));
}

次に、そのメソッドをリフレクションで呼び出します。(使用MethodInfo.MakeGenericMethod(...).Invoke(...))

于 2011-03-17T15:12:25.360 に答える