2012-06-11 4 views
4

PostSharp을 사용하여 가로 채기 클래스에서 differnt 메서드를 호출 할 수 있기를 원합니다. 포스트 샤프를 사용하는 클래스에서 대체 메서드 호출

내가 내 PostSharp 측면에서 다음과 같은 방법을 말해봐 :

CallDifferentMethod()
public override void OnInvoke(MethodInterceptionArgs args) 
    { 
     if (!m_featureToggle.FeatureEnabled) 
     { 
      base.OnInvoke(args); 
     } 
     else 
     { 
      var instance = args.Instance; 
      instance.CallDifferentMethod(); //this is made up syntax 
     } 
    } 

이 차단 된 클래스 내의 또 다른 방법이다. 나는 반사회적 인 마법을 사용하여 내가 부르길 원하는 이름을 얻을 수 있지만, 그 방법을 호출하는 방법을 찾을 수는 없다. 클래스의 인스턴스. 나는 클래스의 새로운 인스턴스를 시작하고 싶지 않다.

어떤 제안?

답변

3

args.Ststace를 입력하고 있습니까? 당신이 쓴 것을 바탕으로, 나는 "FeatureEnabled"가 인터페이스를 통해 정의되어야한다고 생각합니다.

public interface IHasFeature 
{ 
    bool IsFeatureEnabled { get; set; } 
    void SomeOtherMethod(); 
} 

다음

((IHasFeature)args.Instance).SomeOtherMethod(); 

그 다음 인터페이스에 사용 양태를 적용. 아차, 가엘이 옳다 :

[assembly: MyApp.MyAspect(AttributeTargetTypes = "MyApp.IHasFeature")] 

또는 인터페이스를 직접

[MyAspect] 
public interface IHasFeature 

업데이트에

. 미안합니다. CompileTimeValidate 메서드를 사용하여 컴파일 타임에 애스펙트를 제한하십시오.

public override bool CompileTimeValidate(System.Reflection.MethodBase method) 
     { 
      bool isCorrectType = (Check for correct type here) 
      return isCorrectType; 
     } 

은 자세한 내용은 더스틴를 잘 공통 인터페이스로 캐스팅 관련되어 내 게시물 http://www.sharpcrafters.com/blog/post/Day-9-Aspect-Lifetime-Scope-Part-1.aspx

+0

참조하십시오. 대안은 "동적"인 경우입니다. 그러나, aspect를 인터페이스에 적용해도 aspect를이 인터페이스로 "제한"하지 않는다. 그냥 "적용"합니다. 제한은 CompileTimeValidate를 사용하여 수행해야합니다. –

+0

죄송합니다. @GeafFraiteur가 맞습니다. CompileTimeValidate 메서드를 사용하여 응용 프로그램을 실제로 특정 형식 (컴파일 타임에 완료)으로 제한합니다. –

관련 문제