2017-01-25 3 views
1

내 태양 : (false)를 정지 기본적 ProgramState.State() 메소드를 검사PostSharp - args.ReturnValye = 기본값 (T) -> T = 메소드 반환 유형, 방법?

[Serializable] 
class FlowController : OnMethodBoundaryAspect 
{ 
    [ThreadStatic] 
    private static bool logging; 

    public override void OnEntry(MethodExecutionArgs args) 
    { 
     if (logging) 
      return; 

     try 
     { 
      logging = true; 
      if (ProgramState.State() == false) 
      { 
       args.ReturnValue = ""; // WHAT DO I SET HERE? 
       args.FlowBehavior = FlowBehavior.Return; 
      } 
     } 
     finally 
     { 
      logging = false; 
     } 
    } 
} 

프로그램 (TRUE)을 실행하는 경우는,이 ​​경우를 제어한다 (== 진정한 isPaused가하면서 루프) 일시 메서드를 실행할 수 있습니다 (기본적으로 시작 일시 중지/다시 시작 중지)

그러나 때로는 nullreferences 메서드에서 반환 할 때.

나는 메소드의 기본 리턴 유형으로 리턴 유형을 설정하는 방법을 알고 싶어합니다.

답변

0

메소드 리턴 유형을 나타내는 generic 매개 변수를 사용하여 aspect 클래스를 일반화 할 수 있습니다. 그런 다음 애스펙트 프로 바이더 인 메소드 레벨 애트리뷰트를 생성해야한다. 속성은 사용자 코드에 적용될 것이고 차례로 일반 측면의 올바른 인스턴스를 제공 할 수 있습니다.

[Serializable] 
[MulticastAttributeUsage(MulticastTargets.Method)] 
public class FlowControllerAttribute : MethodLevelAspect, IAspectProvider 
{ 
    public IEnumerable<AspectInstance> ProvideAspects(object targetElement) 
    { 
     MethodInfo method = (MethodInfo) targetElement; 

     Type returnType = method.ReturnType == typeof(void) 
      ? typeof(object) 
      : method.ReturnType; 

     IAspect aspect = (IAspect) Activator.CreateInstance(typeof(FlowControllerAspect<>).MakeGenericType(returnType)); 

     yield return new AspectInstance(targetElement, aspect); 
    } 
} 

[Serializable] 
public class FlowControllerAspect<T> : IOnMethodBoundaryAspect 
{ 
    public void RuntimeInitialize(MethodBase method) 
    { 
    } 

    public void OnEntry(MethodExecutionArgs args) 
    { 
     args.ReturnValue = default(T); 
     args.FlowBehavior = FlowBehavior.Return; 
    } 

    public void OnExit(MethodExecutionArgs args) 
    { 
    } 

    public void OnSuccess(MethodExecutionArgs args) 
    { 
    } 

    public void OnException(MethodExecutionArgs args) 
    { 
    } 
} 

// Usage: 
[FlowController] 
public int Method() 
{ 
    // ... 
} 
+0

고맙습니다! 하지만 ... 기본값 (T)도 null을 반환하지 않을까요? –

+0

음, 기본값 (T)은 주어진 유형 T에 대한 "0"값입니다. 참조 유형의 경우 null, int의 경우 0 등. https://msdn.microsoft.com/en-us/library/xwth0h0d.aspx를 참조하십시오. – AlexD