es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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,>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para aplicar la expresión MyTypeTableFilter a la propiedad myType de tipo T dentro del método HasMyTypeTableFilter, puedes crear una nueva expresión reemplazando el parámetro de MyTypeTableFilter por una expresión que represente la propiedad myType de T. Una forma de hacer esto es utilizando el método Expression.Property para crear una nueva expresión que represente la propiedad myType de x:

    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;
    
        var xParam = Expression.Parameter(typeof(T), "x");
        var myTypeProperty = Expression.Property(xParam, "myType");
        var filter = MyAuthorizationFilters.MyTypeTableFilter(userid, tablename, hideOwnDossier);
        var filterBody = new SwapVisitor(filter.Parameters[0], myTypeProperty)
                        .Visit(filter.Body); // reemplazar el parámetro con la propiedad myType
        var lambda = Expression.Lambda<><t, bool="">>(filterBody, xParam);
    
        return lambda;
    }
    

    En este código, xParam representa el parámetro de la expresión que se creará (T x). Luego, myTypeProperty representa la propiedad myType de x. Luego puedes llamar a MyTypeTableFilter para obtener la expresión del filtro, y utilizar un SwapVisitor (que no se muestra aquí) para reemplazar el primer parámetro de la expresión del filtro (que representa un myType) con myTypeProperty. Finalmente, se crea una nueva expresión lambda utilizando Expression.Lambda con el cuerpo modificado y el parámetro original xParam.

    Ahora, puedes utilizar el método HasMyTypeTableFilter de la siguiente manera:

    var filter = MyAuthorizationFilters.HasMyTypeTableFilter<mytype>("userid", "tablename", true);
    var filteredItems = items.Where(filter);
    

    Aquí, items es una colección de objetos que implementan IHasMyType y tienen una propiedad myType de tipo MyType. filter es una expresión que representa el filtro que se aplicará a items. El método Where se llama en items con filter como argumento para obtener una nueva colección que contenga solo los elementos que cumplen con los criterios del filtro.</t,></t,>

Comments are closed.