タイトルが示すように: 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)
op_Equality
したがって、最初に という名前のすべてのメソッドに一致し、次にこれらのメソッドのすべての呼び出し元をリストする CQLinq クエリが必要です。これは次のようになります。
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) }
これはかなりうまくいくようです:)