2017-03-01 10 views
1

私はジェネリッククラスを持っていると言う:ジェネリッククラスの特定の実装からアスペクトを除外しますか?

public abstract class MyClass<T> { 
    // Contents 
} 

どのように私はTの唯一の特定の種類の私の側面のために除外指定することができますか?

[assembly: LogMethod(AttributePriority = 0, 
        AttributeTargetTypeAttributes = MulticastAttributes.Public, 
        AttributeTargetMemberAttributes = MulticastAttributes.Public, 
        AttributeTargetElements = MulticastTargets.Method)] 

答えて

1

宣言的な方法でフィルタリングジェネリック引数を適用することはできません:私はそうのように、ithe AssemblyInfo.csに側面を追加しています。アスペクトターゲットの高度なフィルタリングの場合は、アスペクトでCompileTimeValidateメソッドをオーバーライドし、プログラムでフィルタできます。

しかし、これでも説明した場合は十分ではありません。たとえば、MyClass<T>のメソッドにアスペクトを適用したとします。コンパイルのこの時点では、Tは未知であるため、チェックを実行することはできません。具体的なTは、MyClass<T>のフィールドまたは変数がコード内の他の場所で宣言されている場合に認識されます。

あなたのケースでは、instance-scopedのアスペクトを作成し、実行時にターゲットクラスのインスタンスごとに検証することをお勧めします。このアプローチのサンプル実装を以下で見つけることができます。

[PSerializable] 
public class LogMethodAttribute : OnMethodBoundaryAspect, IInstanceScopedAspect 
{ 
    private bool disabled; 

    public override void OnEntry(MethodExecutionArgs args) 
    { 
     if (!this.disabled) 
     { 
      Console.WriteLine("OnEntry: {0}({1})", args.Method.Name, args.Arguments.GetArgument(0)); 
     } 
    } 

    public object CreateInstance(AdviceArgs adviceArgs) 
    { 
     LogMethodAttribute clone = (LogMethodAttribute) this.MemberwiseClone(); 

     Type type = adviceArgs.Instance.GetType(); 
     if (type.IsGenericType) 
     { 
      Type[] genericArguments = type.GetGenericArguments(); 
      // Filter out targets where T is string. 
      if (genericArguments[0] == typeof(string)) 
      { 
       clone.disabled = true; 
      } 
     } 

     return clone; 
    } 

    public void RuntimeInitializeInstance() 
    { 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var obj1 = new Class1<int>(); 
     obj1.Method1(1); 

     var obj2 = new Class1<string>(); 
     obj2.Method1("a"); 
    } 
} 

[LogMethod(AttributeTargetElements = MulticastTargets.Method)] 
public class Class1<T> 
{ 
    public void Method1(T a) 
    { 
    } 
} 
関連する問題