Ejecutar expresión C# en una propiedad.
Soy bastante nuevo en las expresiones de C#. Ya descubrí que son muy poderosas. Las estoy utilizando para las autorizaciones.
public static Expression<><mytype, bool="">> MyTypeTableFilter(string userid, string tablename, bool hideOwnDossier)
{
var e1 = MySecondTypeAuthorizationFilters.HasMySecondTypeTableFilter<mytype>(userid, tablename, hideOwnDossier);
var e2 = MyThirdTypeAuthorizationFilters.HasMyThirdTypeTableFilter<mytype>(userid, tablename, hideOwnDossier);
return Expression.Lambda<><mytype, bool="">>(Expression.OrElse(new SwapVisitor(e1.Parameters[0], e2.Parameters[0]).Visit(e1.Body), e2.Body), e2.Parameters);
}
Tengo el siguiente método. Me permite filtrar de la siguiente manera:
query = query.Where(MyAuthorizationFilters.MyTypeTableFilter("str", "", bool));
Ahora tengo otro tipo que tiene una propiedad del tipo: ‘myType’.
Quiero reciclar la primera expresión llamándola en mi segunda función:
public static Expression<><t, bool="">> HasMyTypeTableFilter<t>(string userid, string tablename, bool hideOwnDossier)
where T : class, IHasMyType
{
if (string.IsNullOrEmpty(tablename))
tablename = typeof(T).Name;
x=>x.myType // algo como 'where' MyTypeTableFilter
}
Entonces, la ‘x’ en esta función tiene una única propiedad llamada ‘mytype’ de tipo ‘MyType’. Es una única propiedad, por lo que no es una lista ni nada por el estilo. Quiero ejecutar la primera expresión en x.mytype. ¿Alguien puede ayudarme con esto? ¡Gracias de antemano!
Pero no puedo encontrar una manera de lograr esto. También me resulta difícil buscar en Google ya que no conozco los términos correctos. ¿Alguien puede ayudarme con esta expresión?</t,></mytype,></mytype,>
davy.ai
Para aplicar la expresión
MyTypeTableFilter
a la propiedadmyType
de tipoT
dentro del métodoHasMyTypeTableFilter
, puedes crear una nueva expresión reemplazando el parámetro deMyTypeTableFilter
por una expresión que represente la propiedadmyType
deT
. Una forma de hacer esto es utilizando el métodoExpression.Property
para crear una nueva expresión que represente la propiedadmyType
dex
:En este código,
xParam
representa el parámetro de la expresión que se creará (T x
). Luego,myTypeProperty
representa la propiedadmyType
dex
. Luego puedes llamar aMyTypeTableFilter
para obtener la expresión del filtro, y utilizar unSwapVisitor
(que no se muestra aquí) para reemplazar el primer parámetro de la expresión del filtro (que representa unmyType
) conmyTypeProperty
. Finalmente, se crea una nueva expresión lambda utilizandoExpression.Lambda
con el cuerpo modificado y el parámetro originalxParam
.Ahora, puedes utilizar el método
HasMyTypeTableFilter
de la siguiente manera:Aquí,
items
es una colección de objetos que implementanIHasMyType
y tienen una propiedadmyType
de tipoMyType
.filter
es una expresión que representa el filtro que se aplicará aitems
. El métodoWhere
se llama enitems
confilter
como argumento para obtener una nueva colección que contenga solo los elementos que cumplen con los criterios del filtro.</t,></t,>