IMPORTANT: MAJOR BREAKING CHANGE COMING SOON

¿Cómo pasar entidades variables a una función genérica?

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

Pregunta

Si genero mis entidades a través de Entity Framework Database First , y quiero usar una función como esa:

AuditManager.DefaultConfiguration.Exclude<T>();

Teniendo en cuenta que el número de veces que quiero llamar debería ser igual al número de entidades

ex:

AuditManager.DefaultConfiguration.Exclude<Employee>();

AuditManager.DefaultConfiguration.Exclude<Department>();

AuditManager.DefaultConfiguration.Exclude<Room>();

Ahora, ¿cómo pasar por el número seleccionado de entidades y pasar cada una a la función Exclude ?

Respuesta aceptada

La solución obvia sería llamar al método para cada tipo de entidad que desee ocultar. Me gusta esto:

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

Puede agregar sentencias condicionales ( if las hay) alrededor de ellas para hacerlo dinámicamente.

Sin embargo, si desea una solución completamente flexible, donde llama al método Exclude basado en metadatos, necesita algo más. Algo como esto:

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);
}

Esto supone que el método Exclude<T> es un método de instancia en cualquier instancia que DefaultConfiguration apunte.


Respuesta popular

Una alternativa al bucle a través de sus tipos de entidad es hacer que las entidades que no desea auditar implementen la misma interfaz y excluirla. Por ejemplo:

public interface IExcludeFromAudit
{ }

Y tus entidades:

public class Order : IExcludeFromAudit
{
    //snip
}

Y ahora solo excluye la interfaz:

AuditManager.DefaultConfiguration.Exclude<IExcludeFromAudit>();

El beneficio de esto es que ahora es fácil controlar cuáles están excluidos.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow