2012-11-26 8 views
6

Sto cercando di creare un aspetto PostSharp RunOutOfProcessAttribute in modo che essa si applica a:Applicare un aspetto da solo i metodi che hanno un attributo specifico

  1. tutti i metodi pubblici
  2. qualsiasi metodo contrassegnata con il DoSpecialFunctionAttribute, indipendentemente dall'accessibilità dei membri (pubblico/protetto/privato/qualunque).

Finora, il mio RunOutOfProcessAttribute è definito così:

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

Il MulticastAttributeUsageAttribute già in atto dovrebbe soddisfare sopra criterio 1, ma ho idea di come soddisfare il criterio 2, senza semplicemente duplicare la comportamento dell'aspetto esistente in un nuovo attributo.

Come si può applicare questo aspetto a qualsiasi metodo contrassegnato con lo DoSpecialFunctionAttribute, indipendentemente dall'accessibilità dei membri (pubblico/protetto/privato/altro)?

+0

im confusa sul motivo per cui questo è richiesto. Se hai già un 'DoSpecialFunctionAttribute', perché non includere solo la funzione per farlo in quell'attributo? piuttosto che creare ancora un altro aspetto. – caesay

+0

Voglio essere in grado di mettere 'RunOutOfProcessAttribute' su una classe, in quanto definisce più un comportamento di classe rispetto a un comportamento del metodo. 'RunOutOfProcessAttribute' dovrebbe funzionare su * tutti * i metodi della classe pubblica oltre a quelli protetti contrassegnati con' DoSpecialFunctionAttribute'. 'DoSpecialFunctionAttribute' non sarà un aspetto. –

risposta

6

ecco la soluzione:

  • target tutti i metodi con [MulticastAttributeUsage(MulticastTargets.Method)]
  • Override CompileTimeValidate(MethodBase method). Impostare i valori di ritorno in modo tale che restituisca true su target appropriati, false sui destinatari per ignorare automaticamente e genera un'eccezione quando l'utente deve essere avvisato che l'uso di Aspect è inappropriato (questo è dettagliato in PostSharp documentation).

in codice:

[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; 
    } 
} 
Problemi correlati