2012-11-19 22 views
2

我有幾種方法,有folling結構:在開始和結束時調用方法 - 在C#中有更好的方法嗎?

public void doWhatever() 
    { 
    methodToPrepareEnvironment(); 
    // do something 
    methodToResumeEnvironment(); 
    } 

我所有的「doWhatever」型方法調用這些準備/恢復方法和只有1準備和1份簡歷所有這些doWhatever方法調用的方法。有沒有更好的方法來實現這一點,而不必在我所有的任何方法開始和結束時撥打準備和恢復方法?我有這種感覺,我錯過了一些非常基本的東西。請注意,無論哪種方法無法組合,它們都需要獨立,每個方法都需要準備環境,執行一些任務,然後恢復環境。

謝謝。

+0

在相同的類或單獨的類中是「doWhatever」類型的方法嗎? –

回答

5

與戰略使用訪問修飾符可以確保外部調用總是前面和後面的方法調用很少重複,像這樣:

public void DoWhatever() 
{ 
    DoAction(DoingWhatever); 
} 

private void DoingWhatever() 
{ 
    // ... 
} 

private void DoAction(Action action) 
{ 
    methodToPrepareEnvironment(); 

    action(); 

    methodToResumeEnvironment(); 
} 

Action是表示沒有返回值的方法的委託。

+0

謝謝。我理解這是將「要調用的方法」作爲另一種方法的參數傳遞的能力。簡單而優雅。 – leoinlios

+0

@leoinlios:沒錯。這也是一種依賴倒置形式,它是SOLID中的D原理。 –

3

有沒有更好的方法來實現這一點,而無需在我所有的任何方法開始和結束時撥打準備和恢復方法的電話?

傳遞一個委託(二建的有ActionFunc):

public void doWhatever(Action anAction) 
{ 
methodToPrepareEnvironment(); 

anAction(); 

methodToResumeEnvironment(); 
} 

在保證PrepareResume問候是總是稱爲 - 上面沒有迎合爲此,因爲anAction可以被任何有權訪問的代碼調用。

你可以調查AOP - 一個流行的工具是PostSharp

+1

這也是我的建議,但不幸的是,它不會限制人們在沒有周圍電話的情況下調用「anAction」... – sybkar

+0

@sybkar - 看不到這怎麼可能。如果存在方法,則不能將其限制爲以特定方式調用(即必須首先或在之後調用另一個方法)。 – Oded

+0

我很確定它不能完成,我只是提到它「完全公開」 – sybkar

1

這是我會怎麼做,引入具有的功能被稱爲methodToPrepareEnvironment()和methodToResumeEnvironment()之間,然後將funcion附加到委託並調用doWhatever這樣

doWhatever(Fn); 
簽名的委託

//////

public delegate void ToDO(); 
class Program 
{ 
    public void Fn() 
    { 

     Console.WriteLine("This is Fn"); 

    } 

    public void doWhatever(ToDO t) 
    { 
     methodToPrepareEnvironment(); 
     t(); 
     methodToResumeEnvironment(); 
    } 
} 
+0

謝謝。我測試了這一點,發現行爲與使用Action類型參數完全相同,除了在這裏我必須首先分別聲明委託。不知道一種方法比另一種更好,但在這裏我有一個額外的聲明。 – leoinlios

1

一個稍微不同的選項(雖然不是「乾淨」,因爲這些選項,肯定並不像直觀有人試圖維持竟被代碼d是帶有屬性標記的功能,然後有一個創建步驟,注入方法調用之前和之後:

[WrapWithEnvironmentCalls()] 
public void MyFunction() 
{ 
    // Code goes here 
} 

我相信CTP Rosalyn有一些功能來處理這個。我不會在代碼中做到這一點,它不可維護,直觀,並可能在代碼審查中被撕碎,但我只是將它作爲替代選項提供給更多人冒險。

相關問題