Se genero le mie entità tramite Entity Framework Database First , e voglio usare una funzione del genere:
AuditManager.DefaultConfiguration.Exclude<T>();
considerando che il numero di volte che voglio chiamarlo dovrebbe essere uguale al numero di entità
ex:
AuditManager.DefaultConfiguration.Exclude<Employee>();
AuditManager.DefaultConfiguration.Exclude<Department>();
AuditManager.DefaultConfiguration.Exclude<Room>();
Ora come passare in rassegna il numero selezionato di entità e passare tutti alla funzione Exclude
?
La soluzione ovvia sarebbe chiamare il metodo per ogni tipo di entità che si desidera nascondere. Come questo:
AuditManager.DefaultConfiguration.Exclude<Employee>();
AuditManager.DefaultConfiguration.Exclude<Department>();
AuditManager.DefaultConfiguration.Exclude<Room>();
È possibile aggiungere dichiarazioni condizionali ( if
s) intorno a loro per farlo dinamicamente.
Tuttavia, se si desidera una soluzione completamente flessibile, in cui si chiami il metodo Exclude
basato sui metadati, è necessario qualcos'altro. Qualcosa come questo:
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);
}
Ciò presuppone che il metodo Exclude<T>
sia un metodo di istanza su qualsiasi istanza a cui DefaultConfiguration
punta.
Un'alternativa al ciclo dei tipi di entità consiste nel rendere le entità che non si desidera controllare implementare la stessa interfaccia ed escluderla. Per esempio:
public interface IExcludeFromAudit
{ }
E le tue entità:
public class Order : IExcludeFromAudit
{
//snip
}
E ora basta escludere l'interfaccia:
AuditManager.DefaultConfiguration.Exclude<IExcludeFromAudit>();
Il vantaggio di questo è che ora è facile controllare quali sono esclusi.