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

如何在Mono.Cecil中无需解析名称判断MethodDefinition是否为C#运算符?

在Mono.Cecil中判断MethodDefinition是否为C#运算符(无需解析方法名)

当然有办法,不用硬解析op_Equality这类名称,你可以通过以下几个维度综合判断:

  • 检查方法的IsSpecialName属性是否为true:C#编译器会给运算符、属性访问器这类特殊方法标记这个属性
  • 验证方法是否带有System.Runtime.CompilerServices.CompilerGeneratedAttribute:C#自动生成的运算符方法会被添加这个特性
  • 结合方法的参数和返回值特征进一步筛选:比如相等运算符返回bool、有2个同类型参数;一元运算符通常只有1个参数,返回值和参数类型一致等

示例代码

using Mono.Cecil;
using System.Linq;

public static bool IsCSharpOperator(MethodDefinition method)
{
    // 第一步:特殊方法标记是基础条件
    if (!method.IsSpecialName)
        return false;

    // 第二步:检查是否为编译器生成的特性
    bool hasCompilerGeneratedAttr = method.CustomAttributes.Any(attr => 
        attr.AttributeType.FullName == "System.Runtime.CompilerServices.CompilerGeneratedAttribute");
    
    if (!hasCompilerGeneratedAttr)
        return false;

    // 第三步:通过参数和返回值排除属性访问器(get/set)
    // 属性get方法:无参数、有返回值;set方法:1个参数、返回值为void
    if ((method.Parameters.Count == 0 && method.ReturnType.FullName != "System.Void") ||
        (method.Parameters.Count == 1 && method.ReturnType.FullName == "System.Void"))
    {
        return false;
    }

    // 到这里基本可以确定是运算符方法,若要细分类型可继续判断参数/返回值
    return true;
}

补充说明

如果完全不碰方法名称,仅靠前两个条件会把属性的get/set方法也包含进来,所以加上参数和返回值的判断就能精准区分——C#运算符要么是一元(1个参数)要么是二元(2个参数),且返回值不会是void,和属性访问器的特征差异明显。

内容的提问来源于stack exchange,提问作者mark

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 16:28:14