Creating lambda expression ConstantExpression with a string value

c# constant-expression expression-trees lambda

Question

I want to create lambda expression providing property name, a value (as string) and property type (as Type).

The problem with that is in line Expression.Constant(value1, propertyType);
value1 that is passed to Foo is string. and must be parsed to "unknown" type

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

Accepted Answer

I think you should have T where you currently have TheObject.

To convert the string, you can call the Convert.ChangeType() method in your expression and cast the resulting object:

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

Just casting won't work, because code like (int)"42" is not valid.




Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Is this KB legal? Yes, learn why
Licensed under: CC-BY-SA with attribution
Not affiliated with Stack Overflow
Is this KB legal? Yes, learn why