2012-11-26 22 views
6

Ich versuche RunOutOfProcessAttribute einen Postsharp Aspekt einzurichten, so dass es gilt für:einen Aspekt nur Methoden anwenden, die ein bestimmtes Attribut haben

  1. alle öffentlichen Methoden
  2. jede Methode mit dem DoSpecialFunctionAttribute gekennzeichnet, unabhängig von der Zugänglichkeit für Mitglieder (öffentlich/geschützt/privat/was auch immer).

Bisher meine RunOutOfProcessAttribute ist thusly definiert:

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

Die MulticastAttributeUsageAttribute bereits an Ort und Stelle sollte 1 oben Kriterium erfüllen, aber ich habe keine Ahnung, wie 2 erfüllen Kriterium ohne einfach das Duplizieren Verhalten des vorhandenen Aspekts in ein neues Attribut.

Wie würde ich diesen Aspekt auf jede mit der DoSpecialFunctionAttribute gekennzeichnete Methode anwenden, unabhängig von der Zugänglichkeit für Mitglieder (öffentlich/geschützt/privat/was auch immer)?

+0

im verwirrt, warum dies erforderlich ist. Wenn Sie bereits ein DoSpecialFunctionAttribute haben, warum sollten Sie nicht einfach die Funktion in dieses Attribut einfügen? anstatt einen ANDEREN Aspekt zu erschaffen. – caesay

+0

Ich möchte in der Lage sein, 'RunOutOfProcessAttribute' auf eine Klasse zu setzen, da es ein Klassenverhalten eher definiert als ein Methodenverhalten. 'RunOutOfProcessAttribute' sollte mit * all * öffentlichen Klassenmethoden arbeiten, zusätzlich zu allen geschützten Klassen, die mit' DoSpecialFunctionAttribute' gekennzeichnet sind. 'DoSpecialFunctionAttribute' ist kein Aspekt. –

Antwort

6

Hier ist die Lösung:

  • Ziel alle Methoden mit [MulticastAttributeUsage(MulticastTargets.Method)]
  • Aufschalten CompileTimeValidate(MethodBase method). Richten Sie die Rückgabewerte so ein, dass CompileTimeValidate auf geeigneten Zielen, false auf Zielen zurückgibt, die ignoriert werden sollen, und eine Ausnahme auslöst, wenn der Benutzer gewarnt wird, dass die Verwendung von Aspect unangemessen ist (dies wird im Dokument PostSharp documentation beschrieben).

In Code:

[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; 
    } 
} 
Verwandte Themen