2017-04-19 66 views
0

如果我通过Entity Framework Database First生成我的实体,我想用这样的一个功能:如何将变量实体传递给泛型函数?

AuditManager.DefaultConfiguration.Exclude<T>(); 

考虑的次数,我想叫它应该等于实体的数量

例如:

AuditManager.DefaultConfiguration.Exclude<Employee>(); 

AuditManager.DefaultConfiguration.Exclude<Department>(); 

AuditManager.DefaultConfiguration.Exclude<Room>(); 

现在如何通过实体的选择数量的环路,并通过每一个到Exclude功能?

+0

您不是将实体传递给泛型函数,而是将**实体类型**传递给泛型函数。 – Maarten

+0

@Maarten:U是正确的,如何创建实体类型列表并将项目传递给泛型函数? –

+0

这听起来像是一个X-Y问题,你究竟想要在这里实现什么目标? – DavidG

回答

2

显而易见的解决方案是为每个你想隐藏的实体类型调用该方法。就像这样:

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

您可以添加他们周围的条件语句(if S)动态地做到这一点。

Howevery,如果你想要一个完全灵活的解决方案,在那里你调用基于元数据的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指向一个实例方法。

2

循环遍历实体类型的替代方法是让不想审核的实体实现相同的接口并排除该实体。例如:

public interface IExcludeFromAudit 
{ } 

而且你的实体:

public class Order : IExcludeFromAudit 
{ 
    //snip 
} 

现在只排除接口:

AuditManager.DefaultConfiguration.Exclude<IExcludeFromAudit>(); 

这样做的好处是,它现在很容易控制哪些被排除在外。