如何在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
相关产品推荐
相关产品推荐

