You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:24:01