7

NDependを使用して、特定のメソッドまたはプロパティの直接的および間接的な使用をすべて見つけるにはどうすればよいですか?

特に、 use パスのどこかにあるインターフェースを介して発生する使用法を見つける必要があります。ありがとう!

4

1 に答える 1

7

UIの任意の場所でメソッドを右クリックし、メニューを選択します。[メソッドの選択...> ...私を(直接的または間接的に)使用している場合は、次のようなコードクエリが表示されます。

from m in Methods 
let depth0 = m.DepthOfIsUsing("NUnit.Core.NUnitFramework+Assert.GetAssertCount()")
where depth0  >= 0 orderby depth0
select new { m, depth0 }

問題は、そのようなクエリは間接的な使用法を提供しますが、インターフェイス(または基本クラスで宣言されたオーバーライドされたメソッド)を介して発生する呼び出しを検索しないことです。

うまくいけば、あなたが求めているものはこのクエリで取得できます:

// Retrieve the target method by name
let methodTarget = Methods.WithFullName("NUnit.Core.NUnitFramework+Assert.GetAssertCount()").Single()

// Build a ICodeMetric<IMethod,ushort> representing the depth of indirect
// call of the target method.
let indirectCallDepth = 
   methodTarget.ToEnumerable()
   .FillIterative(
       methods => methods.SelectMany(
          m => m.MethodsCallingMe.Union(m.OverriddensBase)))

from m in indirectCallDepth.DefinitionDomain
select new { m, callDepth = indirectCallDepth[m]  }

このクエリの2つの重要な要素は次のとおりです。

  • 間接呼び出しを再帰的に選択するためのFillIterative()の呼び出し。
  • その名前が示すように、プロパティIMethod.OverriddensBaseへの呼び出し。メソッドMの場合、これは、 Mによってオーバーライドされた、基本クラスまたはインターフェースで宣言されたすべてのメソッドの列挙可能オブジェクトを返します。
于 2012-06-13T14:34:20.680 に答える