2015-06-02 34 views
0

例如:我有類似以下的自定義屬性類:我可以使用面向方面的方法訪問自定義方法屬性嗎?

[System.AttributeUsage(System.AttributeTargets.Method) 
] 
public class Yeah: System.Attribute 
{ 
    public double whatever = 0.0; 
} 

現在我裝點一些方法與它這樣的:

[Yeah(whatever = 2.0)] 
void SampleMethod 
{ 
    // implementation 
} 

是否有可能通過訪問呀屬性通過方面注入代碼?我更喜歡AOP的postsharp框架,但我也對任何其他解決方案感到滿意,因爲我認爲postsharp中有這樣的功能,但僅在專業版中提供(在此提及:PostSharp Blog

+0

你想對價值做什麼?例如。在一些私有方法中使用它,等等... –

+0

我想用它來寫一種特殊的日誌文件。某些方法應該在成功返回後將屬性寫入此日誌文件。 F.E.我有一些狀態機,並希望記錄退出事務,但不希望將此日誌記錄添加到代碼中的每個方法,但具有屬性和方面。 – seveves

+0

是否可以將版本作爲aspect屬性本身的參數? –

回答

1

看看NConcern .NET AOP Framework 。這是我積極工作的一個新的開源項目。

//define aspect to log method call 
public class Logging : IAspect 
{ 
    //define method name console log with additional whatever information if defined. 
    public IEnumerable<IAdvice> Advise(MethodInfo method) 
    { 
     //get year attribute 
     var year = method.GetCustomAttributes(typeof(YearAttribute)).Cast<YearAttribute>().FirstOrDefault(); 

     if (year == null) 
     { 
      yield return Advice.Basic.After(() => Console.WriteLine(methode.Name)); 
     } 
     else //Year attribute is defined, we can add whatever information to log. 
     { 
      var whatever = year.whatever; 
      yield return Advice.Basic.After(() => Console.WriteLine("{0}/whatever={1}", method.Name, whatever)); 
     } 
    } 
} 

public class A 
{ 
    [Year(whatever = 2.0)] 
    public void SampleMethod() 
    { 
    } 
} 

//Attach logging to A class. 
Aspect.Weave<Logging>(method => method.ReflectedType == typeof(A)); 

//Call sample method 
new A().SampleMethod(); 

//console : SampleMethod/whatever=2.0 

我的日誌記錄方面只是在調用方法時寫入方法名稱。它包括定義時的任何信息。

相關問題