首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Expression.Property的Expression.Convert类型

Expression.Property的Expression.Convert类型
EN

Stack Overflow用户
提问于 2014-07-25 02:33:17
回答 2查看 10.6K关注 0票数 3

我正在尝试转换一个参数表达式,但在转换为值类型时遇到了问题。下面是我的代码示例:

代码语言:javascript
复制
public static MemberExpression ConvertToType(ParameterExpression sourceParameter,
                                              PropertyInfo propertyInfo, 
                                              TypeCode typeCode)
{
    var sourceExpressionProperty = Expression.Property(sourceParameter, sourceProperty);

    //throws an exception if typeCode is a value type.
    Expression convertedSource = Expression.Convert(sourceExpressionProperty,
                                                Type.GetType("System." + typeCode));

    return convertedSource;
}

我得到以下无效操作异常:

No coercion operator is defined between types 'System.String' and 'System.Decimal'.

对此转换的任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-05 04:58:20

我采用的解决方案是:

代码语言:javascript
复制
private static Expression GetConvertedSource(ParameterExpression sourceParameter,
                                             PropertyInfo sourceProperty, 
                                             TypeCode typeCode)
{
    var sourceExpressionProperty = Expression.Property(sourceParameter,
                                                       sourceProperty);

    var changeTypeCall = Expression.Call(typeof(Convert).GetMethod("ChangeType", 
                                                           new[] { typeof(object),
                                                            typeof(TypeCode) }),
                                                            sourceExpressionProperty,
                                                            Expression.Constant(typeCode)
                                                            );

    Expression convert = Expression.Convert(changeTypeCall, 
                                            Type.GetType("System." + typeCode));

    var convertExpr = Expression.Condition(Expression.Equal(sourceExpressionProperty,
                                            Expression.Constant(null, sourceProperty.PropertyType)),
                                            Expression.Default(Type.GetType("System." + typeCode)),
                                            convert);



    return convertExpr;
}

请注意处理空值的Expression.Condition

票数 1
EN

Stack Overflow用户

发布于 2014-08-04 17:48:31

代码语言:javascript
复制
public class ExpressionUtils
{
    public static MethodCallExpression ConvertToType(
        ParameterExpression sourceParameter,
        PropertyInfo sourceProperty,
        TypeCode typeCode)
    {
        var sourceExpressionProperty = Expression.Property(sourceParameter, sourceProperty);
        var changeTypeMethod = typeof(Convert).GetMethod("ChangeType", new Type[] { typeof(object), typeof(TypeCode) });
        var callExpressionReturningObject = Expression.Call(changeTypeMethod, sourceExpressionProperty, Expression.Constant(typeCode));
        return callExpressionReturningObject;
    }
}

请注意,结果表达式是对Convert.ChangeType方法的调用,该方法将返回System.Object。

这是一个单元测试:

代码语言:javascript
复制
[TestClass]
public class UnitTest1
{
    private class MyClass
    {
        public string ValueAsString { get; set; }
    }

    [TestMethod]
    public void TestMethod1()
    {
        var parameter = Expression.Parameter(typeof(MyClass));
        var property = typeof(MyClass).GetProperty("ValueAsString");
        var lambdaBody = ExpressionUtils.ConvertToType(parameter, property, TypeCode.Decimal);
        var lambda = Expression.Lambda<Func<MyClass, object>>(lambdaBody, parameter);
        var valueAsDecimal = (decimal) lambda.Compile().Invoke(new MyClass { ValueAsString = "42" });
        Assert.AreEqual(42m, valueAsDecimal);
    }
}
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24941420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档