正如标题所说:我需要一个用于 C#/.net 代码的 NDepend 规则(CQLinq),只要使用 ==(参考比较)比较给定类型的实例,就会触发该规则。换句话说,我想强制程序员使用.Equals。
请注意,所讨论的类型没有重载的相等运算符。
这可能吗?如果是这样,怎么做?:)
谢谢,干杯,蒂姆
正如标题所说:我需要一个用于 C#/.net 代码的 NDepend 规则(CQLinq),只要使用 ==(参考比较)比较给定类型的实例,就会触发该规则。换句话说,我想强制程序员使用.Equals。
请注意,所讨论的类型没有重载的相等运算符。
这可能吗?如果是这样,怎么做?:)
谢谢,干杯,蒂姆
使用下面的代码,查看值类型,==
转换为 IL 指令:ceq
. 使用 NDepend 无法检测到这种用法。
int i = 2;
int j = 3;
Debug.Assert(i == j);
var s1 = "2";
var s2 = "3";
Debug.Assert(s1 == s2);
但是对于引用类型,我们可以看到一个名为的操作符方法op_Equality
被调用。
L_001d: call bool [mscorlib]System.String::op_Equality(string, string)
因此,我们只需要一个 CQLinq 查询,它首先匹配所有名为的方法op_Equality
,然后列出这些方法的所有调用者。这看起来像:
let equalityOps = Methods.WithSimpleName("op_Equality")
from m in Application.Methods.UsingAny(equalityOps)
select new { m,
typesWhereEqualityOpCalled = m.MethodsCalled.Intersect(equalityOps).Select(m1 => m1.ParentType) }
这似乎工作得很好:)