我正在使用新的.Net 4.5功能在这样的方法签名中将Optional
参数指定为OptionalAttribute
(请参见MSDN)。
public void GenerateReport(int ReportId, [Optional] string saveToFolderPath)
这很好。
如果未传递可选的
saveToFolderPath
参数,我想使用静态方法
saveToFolderPath
将
Directory.GetCurrentDirectory
的值设置为当前工作目录。
当我尝试输入时,出现以下警告/错误。
属性参数必须是常量表达式,typeof表达式
或属性参数类型的数组创建表达式
那么,我的选择是否仅限于检查方法中的
saveToFolderPath
参数是
null
还是空,而不是检查签名本身?
换句话说,我的问题是,如何将使用OptionalAttribute语法的Optional Parameter的值设置为Current Directory?
你不能可选参数的默认值作为常数存储在IL中。 “当前目录”不是常量,因此不能用作默认值。
最容易想到的是将可选值设置为null,在这种情况下使用当前目录:
// 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所示,另一种选择是使用两个重载。
我是一名优秀的程序员,十分优秀!