2010-11-10 71 views
1

有沒有什麼方法可以編寫擴展.NET Attribute類的自定義類,以便我可以將該類應用於方法,並且.NET Framework在執行該方法之前調用我的類構造方法。這裏是示例.NET屬性類插入

public class TestAttribute : Attribute 
{ 
    public TestAttribute() 
    { 
     Console.WriteLine("Called"); 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     TestMethod(); 
    } 

    [TestAttribute()] 
    public static void TestMethod() 
    { 

    } 

} 

我想調用TestMethod時,框架將執行TestAttribute()構造函數。

回答

2

在常規的.NET屬性中,除了一組非常有限的系統屬性(安全性等)外,不會導致魔術調用。其餘的僅通過申請通過反思,這必須明確完成。

您可能會看PostSharp(現在更名爲commercial product)。

+0

另一個選項(ASP.NET MVC只)創造ActionFilterAttribute'的'子類。查看示例[here](http://www.davidhayden.com/blog/dave/archive/2008/03/21/ActionFilterAttributeExamplesASPNETMVCFrameworkPreview2.aspx)。 – rsenna 2010-11-10 15:53:16

+0

@rsenna是一個非常具體的例子,它最終仍然通過反射來調用。 – 2010-11-10 15:56:38

+0

@Marc Gravell:1)這就是爲什麼我將它添加爲評論,而不是作爲迴應。 2)它完成了工作(OP希望將運行時行爲添加到方法中,我不認爲他/她在意實現細節)。 3)我給你+1,所以不要抱怨! ;-) – rsenna 2010-11-10 16:01:39

1

我不這麼認爲 - 屬性只能通過反射代碼的東西來讀取,它們在正常執行過程中不會被調用。

0

是的,這是可能的,但不是。

你可以通過使用Aspect Oriented Programming來實現。 PostSharp是一個允許你這樣做的框架;它允許您在編譯時將代碼「編織」到代碼中。

Postsharp

[Serializable] 
public class TestAttribute : OnMethodInvocationAspect 
{ 
    public override void OnInvocation() 
    { 
     Console.WriteLine ("TestAttribute called"); 
     base.OnInvocation(); 
    } 
}