1

タイトルが示すように: C#/.net コード用の NDepend ルール (CQLinq) が必要です。これは、特定の型のインスタンスが == (参照比較) を使用して比較されるたびに起動します。つまり、プログラマーに .Equals の使用を強制したいのです。

問題の型にはオーバーロードされた等価演算子がないことに注意してください。

これは可能ですか?もしそうなら、どのように?:)

ありがとう、乾杯、ティム

4

1 に答える 1

1

次のコードでは、値の型==が 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) }

これはかなりうまくいくようです:)

ここに画像の説明を入力

于 2013-05-25T15:55:00.917 に答える