2012-11-02 65 views
5

我想創建一個屬性HandleError,我會穿上這樣一類:的屬性,將包裝所有方法,在課堂上使用try {}趕上

[HandleError] 
public class Foo 
{ 
    public void Do(){} 
... 
    public void Don(){} 
} 

,它會包裹在嘗試所有方法趕上,所以我相信它應該是這樣的:

public class HandleErrorAttribute : Attribute 
{ 
    public void Execute() 
    {  
     try 
     { 
      method.Execute(); 
     } 
     catch(Exception ex) 
     { 
      //log 
     } 
    } 
} 

這是可能的嗎?

+1

在當前的框架,沒有。儘管AOP庫中有一個可能是可能的。 http://www.sharpcrafters.com/aop.net – asawyer

+0

這不是什麼屬性。正如@asawyer所說,postsharp可以允許這樣做;並且在將來的版本中,這種事情可能作爲擴展感謝編譯器重寫(aka Roslyn);但目前:沒有 –

+0

@MarcGravell,你認爲這是因爲Roslyn而內置的,還是你認爲我們必須爲它構建一個開源項目? –

回答

3

您正在尋找像PostSharp之類的東西,這非常值得實施。但是,這個問題的實施遠遠超出了這個問題的範圍。看看這link,你會看到它正在做你想做的。

因此,請下載PostSharp,開始使用它,如果您對此有更多疑問,我們將能夠爲您提供幫助。但是,他們的文檔非常好,並且它是實施的蛋糕。

[Serializable] 
public class MyExceptionHandling : OnMethodBoundaryAspect 
{ 
    public override void OnException(MethodExecutionArgs args) 
    { 
     // here you would perform the logging 
    } 
} 

然後在你的方法,你會用新的屬性標記它:

public class Foo 
{ 
    [MyExceptionHandling] 
    public void Do(){} 
    [MyExceptionHandling] 
    public void Don(){} 
} 
+0

那麼如何使用postsharp編寫此屬性? – Omu

+0

@ChuckNorris,通過實現'OnException'方法,它被PostSharp包裝在'try-catch'塊中,這樣PostSharp就可以讓你處理它。 –

+0

好吧,所以如果不這樣做拋出OnException,異常不會進一步 – Omu