2017-01-25 12 views
1

マイ態様: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; 
     } 
    } 
} 

基本的ProgramState.State()メソッドをチェックプログラムは、(真の)実行されている場合、(真== isPausedながらループ)を一時停止は、(false)を停止し、これは、IFを制御しなければなりませんメソッドを実行するかどうかを指定できます(基本的には一時停止/再開を停止します)

ただし、メソッドから戻るときにnull参照を取得することがあります。

私は、戻り値の型をメソッドのデフォルトの戻り値の型に設定する方法を知りたいと考えています。

答えて

0

メソッドの戻り値の型を表すジェネリックパラメータを使用して、アスペクトクラスを汎用にすることができます。次に、アスペクトプロバイダーでもあるメソッドレベルの属性を作成する必要があります。属性はユーザーコードに適用され、一般的なアスペクトの正しいインスタンスを提供できます。

[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の "ゼロ"値です。参照型の場合はnull、intの場合は0など。https://msdn.microsoft.com/en-us/library/xwth0h0d.aspxを参照してください。 – AlexD

関連する問題