2017-04-19 46 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>(); 

這樣做的好處是,它現在很容易控制哪些被排除在外。