Создание лямбда-выражения ConstantExpression со строковым значением - PullRequest
0 голосов
/ 19 июня 2011

Я хочу создать лямбда-выражение, содержащее имя свойства, значение (в виде строки) и тип свойства (в виде типа).

Проблема с этим в строке Expression.Constant(value1, propertyType);
Значение1, которое передается в Foo, является строкой. и должен быть проанализирован для "неизвестного" типа

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

1 Ответ

0 голосов
/ 19 июня 2011

Я думаю, у вас должно быть T там, где у вас есть TheObject.

Чтобы преобразовать строку, вы можете вызвать метод Convert.ChangeType() в своем выражении и привестирезультирующий объект:

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

Просто приведение не будет работать, потому что код типа (int)"42" недопустим.

...