C#中bool与int类型无法反射获取运算符,如何运行时调用?
C# int、bool类型运算符反射查找说明与运行时通用调用方案
为什么int、bool反射查不到运算符方法
C#中运算符重载在编译后会生成名称以op_开头的特殊方法(比如==对应op_Equality、>对应op_GreaterThan),但仅适用于显式定义了运算符重载的类型:
DateTime、decimal、float这类类型的运算没有对应的原生IL指令支持,因此会显式定义运算符重载方法,反射可以正常查到int、bool属于最底层的基元类型,它们的所有运算符直接映射为IL原生指令(比如int的==对应ceq指令、>对应cgt指令),没有生成对应的op_前缀方法,因此用反射查找运算符方法的逻辑对这类类型不生效
所有类型通用的运行时运算符调用方案
下面两种方案无需判断类型是否有显式运算符重载,对所有类型都生效:
方案1:表达式树构造(性能最优,适合高频调用场景)
通过System.Linq.Expressions命名空间下的API动态构造运算逻辑,编译后可复用为委托,性能接近原生代码:
// 示例:构造通用大于比较委托 public static Func<T, T, bool> CreateGreaterThanDelegate<T>() { var leftParam = Expression.Parameter(typeof(T), "left"); var rightParam = Expression.Parameter(typeof(T), "right"); var compareExpr = Expression.GreaterThan(leftParam, rightParam); return Expression.Lambda<Func<T, T, bool>>(compareExpr, leftParam, rightParam).Compile(); } // 调用示例 var intCompare = CreateGreaterThanDelegate<int>(); bool intResult = intCompare(5, 2); // 返回true var dateCompare = CreateGreaterThanDelegate<DateTime>(); bool dateResult = dateCompare(DateTime.Now, DateTime.Now.AddDays(-1)); // 返回true
需要其他运算符只要替换Expression.GreaterThan为对应方法即可,比如Equal对应==、GreaterThanOrEqual对应>=、Add对应+等。
方案2:dynamic动态调用(写法最简单,适合低频调用场景)
如果不需要极致性能,可以用dynamic类型自动适配运算符逻辑:
public static object DynamicOperate(dynamic left, dynamic right, string operateType) { return operateType switch { ">" => left > right, ">=" => left >= right, "==" => left == right, "+" => left + right, _ => throw new NotSupportedException() }; } // 调用示例 bool boolResult = (bool)DynamicOperate(true, false, "=="); // 返回false int addResult = (int)DynamicOperate(3, 4, "+"); // 返回7
内容的提问来源于stack exchange,提问作者Serhii
相关产品推荐
相关产品推荐

