2014-10-05 1 views
0

Say мы имеем свойство как это:Использование атрибутов с параметрами в второстепенным

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
public class LogScopeAttribute : Attribute 
{ 
    public string Level { get; private set; } 

    public LogScopeAttribute(string level) 
    { 
     Level = level; 
    } 
} 

Используется в контексте, как это:

public class Cat 
{ 
    [Log.Scope("Important")] 
    public void Walk() 
    { 
    } 

    [Log.Scope("Trivial")] 
    public void Sit() 
    { 
    } 
} 

Как я могу использовать свойство Level в моем Before и After методы? Похоже, вы можете использовать только свободный интерфейс, но из-за этого я не могу ссылаться на атрибут LogScope.

public class LoggingAmender : Amendment<object, object> 
{ 
    public LoggingAmender() 
    { 
     Methods.Where(m => [...]) 
      .Before(LogScope.LogMethodBefore); // how can I refer to 'Level' of LogScope here? 
    } 
} 

ответ

0

Вы можете получить доступ к методу.Attributes, где хранятся все экземпляры атрибутов этого метода.

Возможно, вам будет легче использовать Лямбда. я не мог доказать этот код, я все еще изучаю Afterthought, но вот что у меня есть:

TDeclaringAttribute в вашем случае - LogScopeAttribute.

/// <summary> 
    /// Pointcut definition for Amendments that are targeted to Methods that have a declaring Attribute defined. 
/// </summary> 
abstract class MethodAmendment<TType, TDeclaringAttribute> : Amendment<TType, TType> 
    where TDeclaringAttribute : Attribute 
{ 
    public MethodAmendment() 
    { 
     foreach (Method method in Methods) 
     { 
      //todo ?? look for base class versions of method ? should be covered by afterthought itself ? 
      TDeclaringAttribute attribute = method.Attributes.OfType<TDeclaringAttribute>().FirstOrDefault(); 
      if (attribute != null) 
      { 
       ApplyMethodChanges(method, attribute); 
      } 
     } 
    } 

    protected abstract void ApplyMethodChanges(Method method, TDeclaringAttribute attribute); 
}