IMPORTANT: MAJOR BREAKING CHANGE COMING SOON

変数エンティティを汎用関数に渡すには?

.net c# entity-framework entity-framework-plus generics

質問

Entity Framework Database Firstを介してエンティティを生成し、そのような関数を使用したい場合:

AuditManager.DefaultConfiguration.Exclude<T>();

私がそれを呼び出す回数がエンティティの数と等しくなければならないと考えている

例:

AuditManager.DefaultConfiguration.Exclude<Employee>();

AuditManager.DefaultConfiguration.Exclude<Department>();

AuditManager.DefaultConfiguration.Exclude<Room>();

どのように選択した数のエンティティをループし、すべてをExclude関数に渡すのですか?

受け入れられた回答

明らかな解決策は、非表示にするエンティティタイプごとにメソッドを呼び出すことです。このような:

AuditManager.DefaultConfiguration.Exclude<Employee>();
AuditManager.DefaultConfiguration.Exclude<Department>();
AuditManager.DefaultConfiguration.Exclude<Room>();

(あなたは、条件文を追加することができifそれらの周りs)は、動的にそれを行うこと。

メタデータに基づいてExcludeメソッドを呼び出す、完全に柔軟なソリューションが必要な場合は、何かが必要です。このようなもの:

var types = new[] { typeof(Employee), typeof(Department), typeof(Room) };
var instance = AuditManager.DefaultConfiguration;
var openGenericMethod = instance.GetType().GetMethod("Exclude");
foreach (var @type in types)
{
    var closedGenericMethod = openGenericMethod.MakeGenericMethod(@type);
    closedGenericMethod.Invoke(instance, null);
}

これは、 Exclude<T>メソッドが、 DefaultConfiguration指すインスタンスのインスタンスメソッドであることを前提としています。


人気のある回答

エンティティタイプをループする代わりに、監査したくないエンティティを同じインターフェイスに実装して除外することもできます。例えば:

public interface IExcludeFromAudit
{ }

あなたのエンティティ:

public class Order : IExcludeFromAudit
{
    //snip
}

そして今、インターフェイスを除外します:

AuditManager.DefaultConfiguration.Exclude<IExcludeFromAudit>();

これの利点は、除外されるものを簡単に制御できるようになったことです。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ