2013-10-01 2 views
1

안녕하세요, 저는 코드 분석을 위해 NDepend를 사용하지 않습니다. 내 코드베이스에서 특정 메서드를 호출하는 모든 메서드를 얻고 싶었는데 예상 한대로 작동하지 않는다는 것을 관찰했습니다. 여기 어떻게 NDepend MethodsCallingMe가 작동합니까?

내 관측이다 : 내 코드에서

내가 가진 :

1) 위의 인터페이스를 구현하는 방법 방법 항목

public interface IMyInterface { 
    void Method1(); 
} 

2) 클래스를 가진 IMyInterface 인터페이스

public class MyClass : IMyInterface { 
    public void Method1() { 
     // Implementation 
    } 
} 

3) 내 프로그램 코드 중 어딘가에 다음과 같은 방법이 있습니다. 나는 MyClass.Method1 방법, 예를 들어, 대한 IMethod 인스턴스를 얻을

: NDepend를 사용하여 이제 다음

public void MethodCaller() { 
    IMyInterface instance = new MyClass(); 
    instance.Method1(); 
} 

, 않습니다, 나는 다음과 같은 관찰 방법 1 정보 및 해당 메서드 호출 내 속성은 결과를 반환합니다. 내가 MethodsCallingMe 속성이 MethodCaller입니다 1 항목을 반환하는 IMyInterace.Method1 방법에 대한 IMethod 인스턴스를 얻을 경우

method1Info.MethodsCallingMe 수는 0

입니다.

어떤 메서드가 호출되는지에 관계없이 특정 메서드 구현을 호출하는 모든 메서드를 찾는 방법을 찾고 있습니다. 나는 MethodsCallingMe로 그것을 달성 할 수 없습니다. 어떻게하면 될까요? 실제로 당신의 맥락에서

답변

0

:

from m in Methods where m.IsUsing ("MyNamespace.IMyInterface.Method1()") select m 

이 ... MyNamespace.CallerClass.MethodCaller() 및 반환 ...

from m in Methods where m.IsUsing ("MyNamespace.MyClass.Method1()") select m 

는 ... 아무 것도 반환하지 않습니다. 그 이유는 간단합니다 : NDepend는 정적 분석을 수행하고 동적 분석을 시도하지 않습니다. 따라서 변수 instanceMethodCaller() 컨텍스트 유형 클래스가 모호함없이 유추 될 수있는 경우에도 추상 메소드를 구현하는 사람을 보려고하지 않습니다.

그러나 NDepend code query language은 매우 유연하므로 다음 코드 쿼리는 사례를 감지하고 원하는 결과를 제공 할 수 있습니다. 가양 성은 일치 할 수 있지만 꽤 비틀 거릴 수 있습니다.

// Gather the abstract method 
let mAbstract = Application.Methods.WithFullName("MyNamespace.IMyInterface.Method1()").Single() 

from m in Methods where m.IsUsing(mAbstract) 

// Get ctors called by MethodCaller() 
let ctorsCalled = m.MethodsCalled.Where(mc => mc.IsConstructor) 

// Get classes that implement IMyInterface instantiated by MethodCaller() 
let classesInstantiated = ctorsCalled.ParentTypes().Where(t => t.Implement("MyNamespace.IMyInterface")) 

// Get override of Method1() 'probably' called. 
let overridesCalled = classesInstantiated.ChildMethods().Where(m1 => m1.OverriddensBase.Contains(mAbstract)) 

select new { m, overridesCalled } 

는 구체적 같은 표정이 : 보조 노트로

enter image description here


, 모호함없이 인터페이스를 통해 참조 된 객체의 클래스를 추론 할 수있는 더는보다 예외 일반적으로 필드와 메소드 매개 변수는 인터페이스를 통해 참조되며 인스턴스화 방법에 대한 정보를 보유하지 않기 때문에


코드는 내가 사용 :

namespace MyNamespace { 
    public interface IMyInterface { 
     void Method1(); 
    } 
    public class MyClass : IMyInterface { 
     public void Method1() { 
      // Implementation 
     } 
    } 
    public class CallerClass { 
     public void MethodCaller() { 
      IMyInterface instance = new MyClass(); 
      instance.Method1(); 
     } 
    } 
} 
관련 문제