2014-04-09 60 views
0

我正在使用新的.Net 4.5功能將Optional參數指定爲方法簽名中的OptionalAttribute(請參閱MSDN),如下所示。如何將可選參數在C#中的OptionalAttribute設置爲當前目錄?

public void GenerateReport(int ReportId, [Optional] string saveToFolderPath) 

這工作正常。

如果可選saveToFolderPath參數未通過,我想使用靜態方法Directory.GetCurrentDirectory將值saveToFolderPath設置爲當前工作目錄。

當我嘗試鍵入,我得到以下警告/錯誤。

的屬性參數必須是常量表達式的typeof屬性參數類型的表達 或數組創建表達式

How To Set OptionalAttribute of Optional Parameter In C#

所以是我的選擇限制到檢查如果saveToFolderPath參數是null或方法內部是空的,而不是簽名本身?

換句話說,我的問題是,如何將使用OptionalAttribute語法的可選參數的值設置爲當前目錄

回答

4

你不能。可選參數的默認值作爲常數存儲在IL中。 「當前目錄」是一個常數,所以它不能被用作默認值。

最接近你可以很容易地來是爲了使可選值零,並使用當前目錄在這種情況下:

// Use the C# syntax for this, rather than specifying the attribute explicitly 
public void GenerateReport(int ReportId, string saveToFolderPath = null) 
{ 
    saveToFolderPath == saveToFolderPath ?? Directory.GetCurrentDirectory(); 
    ... 
} 

我不認爲有什麼事,你可以使用屬性做明確規定你不能對可選參數使用C#語法,所以你可能會習慣於它。

這的確意味着任何人明確通過null會得到相同的行爲,但 - 這可能不是你想要的。另一種方法是像Servy所說的那樣使用兩個重載。

+0

哇!然後傳奇@Jon Skeet回答了我的問題。我感到很榮幸。 – Shiva

4

如果你想要一個選項參數的默認值是一個非編譯時間常數,那麼你就需要使用方法重載來代替:

public void GenerateReport(int ReportId) 
{ 
    GenerateReport(ReportId, Environment.CurrentDirectory); 
} 
public void GenerateReport(int ReportId, string saveToFolderPath) 
{ 
} 
+0

感謝@Servy我喜歡這種方法,也:)不幸的是我只能選擇1的答案,我是你們兩個人之間徘徊。 – Shiva

相關問題