C#是否有内置类可按原生规则转换BinaryExpression所需的不同类型表达式
内置实现方案
C#/.NET 已经公开了完全匹配原生转换规则的官方API,不需要自行实现转换逻辑,常用两种方案:
1. 二元运算场景直接用Expression类的内置运算方法
如果是构建加减乘除等标准二元运算表达式,直接调用Expression.Add/Expression.Subtract/Expression.Multiply等原生静态方法即可,方法内部会自动按照C#隐式类型转换规则,为需要类型适配的操作数自动插入Expression.Convert节点,和C#编译器生成表达式树的逻辑完全一致。
示例代码:
// 定义int类型参数 var intParam = Expression.Parameter(typeof(int), "i"); // 定义decimal类型常量 var decimalConst = Expression.Constant(1.0m, typeof(decimal)); // 直接调用Add方法,不需要手动做类型转换 var addExpression = Expression.Add(intParam, decimalConst);
最终生成的addExpression.Left节点会被自动包装为Convert(intParam, typeof(decimal)),和编译器自动生成的表达式树结构完全相同。
2. 通用类型转换场景用CSharpBinder
如果需要做通用的类型转换(不局限于二元运算场景),可以使用Microsoft.CSharp包下的CSharpBinderAPI(.NET Core 3.0+、.NET 5+ 已内置引用,无需额外安装),生成的转换逻辑完全遵循C#语言规范,支持隐式转换、显式转换、用户自定义转换等所有原生转换规则。
示例代码:
using Microsoft.CSharp.RuntimeBinder; using System.Linq.Expressions; public static Expression AutoConvertByCSharpRule(Expression source, Type targetType) { var convertBinder = Binder.Convert( CSharpBinderFlags.None, targetType, typeof(object) // 此处仅为上下文占位,不影响转换规则 ); return Expression.Dynamic(convertBinder, targetType, source); }
内容的提问来源于stack exchange,提问作者QFirstLast
相关产品推荐
相关产品推荐

