如何将可变实体传递给泛型函数?

How to pass variable entities to a generic function?

如果我通过 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>();

您可以在它们周围添加条件语句 (ifs) 以动态地执行它。

但是,如果您想要一个完全灵活的解决方案,即根据元数据调用 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>();

这样做的好处是现在可以很容易地控制排除哪些。