Creazione di espressione lambda ConstantExpression con un valore stringa

c# constant-expression expression-trees lambda

Domanda

Voglio creare un'espressione lambda che fornisca il nome della proprietà, un valore (come stringa) e il tipo di proprietà (come Tipo).

Il problema con questo è in linea Expression.Constant(value1, propertyType);
valore1 che viene passato a Foo è una stringa. e deve essere analizzato al tipo "sconosciuto"

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

Risposta accettata

Penso che dovresti avere T dove attualmente hai TheObject .

Per convertire la stringa, puoi chiamare il metodo Convert.ChangeType() nell'espressione e lanciare l'oggetto risultante:

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

Il casting non funzionerà, perché il codice come (int)"42" non è valido.



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché