Creación de la expresión lambda ConstantExpression con un valor de cadena

c# constant-expression expression-trees lambda

Pregunta

Quiero crear una expresión lambda que proporcione un nombre de propiedad, un valor (como cadena) y un tipo de propiedad (como Tipo).

El problema con eso está en la línea Expression.Constant(value1, propertyType);
El valor1 que se pasa a Foo es una cadena. y debe ser analizado al tipo "desconocido"

static Expression<Func<T, bool>> LabmdaExpression<T>(string property1, string value1, 
                                                     Type propertyType)
{                              
    var parameterExpression = Expression.Parameter(typeof(TheObject), "o");
    var memberExpression1 = Expression.PropertyOrField(parameterExpression, property1);

    //casting?
    var valueExpression1 = Expression.Constant(value1, propertyType);

    var binaryExpression1 = Expression.GreaterThan(memberExpression1, valueExpression1);
    return Expression.Lambda<Func<T, bool>>(binaryExpression1, parameterExpression);
}

Respuesta aceptada

Creo que deberías tener T donde actualmente tienes TheObject .

Para convertir la cadena, puede llamar al método Convert.ChangeType() en su expresión y convertir el objeto resultante:

static readonly MethodInfo ChangeTypeMethod = typeof(Convert).GetMethod(
    "ChangeType", new[] { typeof(object), typeof(Type) });

static Expression<Func<T, bool>> LabmdaExpression<T>(
    string property1, string value1, Type propertyType)
{
    ParameterExpression parameterExpression = Expression.Parameter(typeof(T), "o");
    MemberExpression memberExpression1 = Expression.PropertyOrField(
        parameterExpression, property1);

    Expression convertedObject = Expression.Call(
        ChangeTypeMethod, Expression.Constant(value1),
        Expression.Constant(propertyType));
    Expression converted = Expression.Convert(convertedObject, propertyType);

    BinaryExpression binaryExpression1 = Expression.GreaterThan(
        memberExpression1, converted);
    return Expression.Lambda<Func<T, bool>>(binaryExpression1, parameterExpression);
}

Simplemente el casting no funciona, porque el código como (int)"42" no es válido.



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