6

RunOutOfProcessAttribute以下に適用されるように、PostSharp アスペクトを設定しようとしています。

  1. すべてのパブリック メソッド
  2. DoSpecialFunctionAttributeメンバーのアクセシビリティ (public/protected/private/whatever) に関係なく、 でマークされたメソッド。

これまでのところ、 myRunOutOfProcessAttributeは次のように定義されています。

[Serializable]
[MulticastAttributeUsage(MulticastTargets.Method, TargetMemberAttributes = MulticastAttributes.Public)]
[AttributeUsage(AttributeTargets.Class)]
public class RunOutOfProcessAttribute : MethodInterceptionAspect
{
    public override void OnInvoke(MethodInterceptionArgs args)
    {
        ...
    }
}

既に配置されているものは上記MulticastAttributeUsageAttributeの基準 1 を満たす必要がありますが、既存のアスペクトの動作を新しい属性に単純に複製することなく、基準 2 を満たす方法がわかりません。

DoSpecialFunctionAttributeメンバーのアクセシビリティ (public/protected/private/whatever) に関係なく、この側面を でマークされたメソッドに適用するにはどうすればよいですか?

4

1 に答える 1

6

解決策は次のとおりです。

  • ですべてのメソッドをターゲットにします[MulticastAttributeUsage(MulticastTargets.Method)]
  • オーバーライドしCompileTimeValidate(MethodBase method)ます。適切なターゲット、サイレントに無視するターゲットでCompileTimeValidate戻り、アスペクトの使用が不適切であることをユーザーに警告する必要がある場合に例外をスローするように、戻り値を設定します (これについては、 PostSharp のドキュメントで詳しく説明されています)。truefalse

コード内:

[Serializable]
[MulticastAttributeUsage(MulticastTargets.Method)]
[AttributeUsage(AttributeTargets.Class)]
public class RunOutOfProcessAttribute : MethodInterceptionAspect
{
    protected static bool IsOutOfProcess;

    public override void OnInvoke(MethodInterceptionArgs args)
    {
        ...
    }

    public override bool CompileTimeValidate(MethodBase method)
    {
        if (method.DeclaringType.GetInterface("IDisposable") == null)
            throw new InvalidAnnotationException("Class must implement IDisposable " + method.DeclaringType);

        if (!method.Attributes.HasFlag(MethodAttributes.Public) && //if method is not public
            !MethodMarkedWith(method,typeof(InitializerAttribute))) //method is not initialiser
            return false; //silently ignore.

        return true;
    }
}
于 2012-11-27T02:49:25.793 に答える