2013-02-19 15 views
0

我有這樣的方法不帶參數爲行動<T>

private void ProcessItem<T>(FileSystemInfo itemInfo, int itemMinAge, Action<T> action, T parameter, string errorMessage, string successMessage = "") 

了適合我的8個要求,例如7飛度行動

ProcessItem<bool>(subDir, dir.MinAge, subDir.Delete, true, string.Format(Messages.NotDeletedFolder, subDir.FullName)); 

它接受一個目錄中,然後,如果滿足dir.MinAge某些標準,是呼叫上的目錄subDir.Delete(true)並將消息記錄。但我也有一個電話,參數action需要沒有<T>參數,因爲我需要通過一個void方法沒有任何參數。

有沒有辦法讓這個方法適合這個方法?我不想僅僅因爲一個電話而創建另一種方法。

回答

2
ProcessItem<object>(subDir, dir.MinAge, 
    ignored => subDir.NoArgs(), 
    /* ignored */ null, 
    string.Format(Messages.NotDeletedFolder, subDir.FullName)); 
1

最簡單的方法可能就是使用lambda表達式。

ProcessItem<bool>(... (param) => myMethod(), ...); 

在這種情況下的參數param將簡單地被忽略,myMethod將被調用爲正常。

2
ProcessItem<bool>(subDir, dir.MinAge, _ => ParameterlessCall() , true, ... 

使用_如lambda表達式參數名是一個函數編程成語對於其值永不需要檢查的參數。

+0

我不喜歡在代碼中下劃線。你有一點,但不是每個人都知道函數式編程。我會用一個詞的表達。 – 2013-02-19 17:32:56

1

創建一個可選的參數,並相應地調整實現:

private void ProcessItem<T>(FileSystemInfo itemInfo, int itemMinAge, Action<T> action = null, Action action2 = null, T parameter, string errorMessage, string successMessage = "") 
+0

可以接受,但在我看來有點笨拙。無論如何,謝謝。 – 2013-02-19 17:29:44