【问题标题】:Creating lambda expression ConstantExpression with a string value使用字符串值创建 lambda 表达式 ConstantExpression
【发布时间】:2011-06-19 13:16:21
【问题描述】:

我想创建提供属性名称、值(作为字符串)和属性类型(作为类型)的 lambda 表达式。

问题在于Expression.Constant(value1, propertyType);
传递给 Foo 的 value1 是字符串。并且必须解析为“未知”类型

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

【问题讨论】:

    标签: c# lambda expression-trees constant-expression


    【解决方案1】:

    我认为您应该拥有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" 这样的代码是无效的。

    【讨论】:

    • 为什么需要 Expression.Convert?
    • 因为Convert.ChangeType() 的返回类型是object,您需要将其转换为实际类型。如果您直接从代码中使用它,您也需要这样做。
    • 你是对的,我在一个简单的例子中试过这个:` string x = "9"; int xx = (int)Convert.ChangeType(x,typeof(int));`
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2023-03-20
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    相关资源
    最近更新 更多