C# 如何使用表达式树对数值类型应用隐式强制转换?

C# 如何使用表达式树对数值类型应用隐式强制转换?,c#,dynamic,expression-trees,expandoobject,C#,Dynamic,Expression Trees,Expandoobject,我有一个带有int字段的ExpandoObject,我想使用表达式树将其转换为十进制 以下是我正在使用的方法: private static Expression<Func<dynamic, decimal>> CreateLambdaCastExpression() { // source var sourceParameterExpression = Expression.Parameter(typeof (object), "

我有一个带有int字段的ExpandoObject,我想使用表达式树将其转换为十进制

以下是我正在使用的方法:

private static Expression<Func<dynamic, decimal>> CreateLambdaCastExpression()
    {
        // source
        var sourceParameterExpression = Expression.Parameter(typeof (object), "source");

        var binder = Binder.GetMember(
            CSharpBinderFlags.None, "IntProp", typeof (ExpressionTreeUtils),
            new[] {CSharpArgumentInfo.Create(CSharpArgumentInfoFlags.None, null)});
        // source.sourceProperty
        var sourcePropertyExpression = Expression.Dynamic(
            binder, typeof (object), sourceParameterExpression);

        // (decimal) source;
        var castedValueExpression = Expression.Convert(sourcePropertyExpression, typeof (decimal));

        // () =>  (decimal) source;
        return Expression.Lambda<Func<dynamic, decimal>>(castedValueExpression,
            sourceParameterExpression);
    }
如果我将source.IntProp设置为1m,它就会工作(显然)

我已经读过ExpressionConvert只对用户定义的类型执行隐式转换,所以这可能就是解释

您知道如何对数值类型执行隐式强制转换吗?

更改以下行:

// CSharpBinderFlags.ConvertExplicit: explicit cast 
// (will convert double to decimal)
// CSharpBinderFlags.None: implicit cast
// (will convert int to decimal, won't convert double to decimal)
var convert = Binder.Convert(CSharpBinderFlags.ConvertExplicit, typeof(decimal), typeof(ExpressionTreeUtils));

// (decimal) source;
var castedValueExpression = Expression.Dynamic(
    convert, typeof(decimal), sourcePropertyExpression);
请注意有关隐式/显式强制转换的注释

(因此唯一改变的是如何构建
var castedvalue表达式


举个完整的例子。

我不确定我是否完全理解了这一点。但是我相信
Expression.Convert
遵循“实现方法是
null
”,因为“
Expression.Type
是引用类型”。它是
对象
。因此,如果它是
var sourcePropertyExpression=Expression.Dynamic(binder、typeof(int)、sourceParameterExpression)这会有帮助。
// CSharpBinderFlags.ConvertExplicit: explicit cast 
// (will convert double to decimal)
// CSharpBinderFlags.None: implicit cast
// (will convert int to decimal, won't convert double to decimal)
var convert = Binder.Convert(CSharpBinderFlags.ConvertExplicit, typeof(decimal), typeof(ExpressionTreeUtils));

// (decimal) source;
var castedValueExpression = Expression.Dynamic(
    convert, typeof(decimal), sourcePropertyExpression);