设置C#可选参数的默认值

24

每当我尝试将可选参数的默认值设置为资源文件中的某些内容时,都会收到编译时错误信息:

'message' 的默认参数值必须是编译时常量。

有没有办法改变资源文件的工作方式以使这个操作成为可能?

public void ValidationError(string fieldName, 
                            string message = ValidationMessages.ContactNotFound)

在这里,ValidationMessages 是一个资源文件。

3个回答

16

一种选择是将默认值设置为null,然后相应地填充:

public void ValidationError(string fieldName, string message = null)
{
    string realMessage = message ?? ValidationMessages.ContactNotFound;
    ...
}

当然,这仅适用于您不希望将 null 视为真正值的情况。

另一个潜在的选择是使用预构建步骤创建一个文件,其中包含基于资源的 const 字符串,并引用这些常量。不过这种方式相对繁琐。


这正是我担心的。我真的很喜欢它在开发时告诉开发人员字符串将是什么的便利性:http://jaxidian.org/optparam.jpg 我意识到我所要求的(编译资源文件)会破坏它存在的部分原因,但我使用它不是为了本地化和动态更改,而只是作为重复使用的字符串的公共存储。 - Jaxidian

13

另一个选择是将您的方法拆分为两部分,并让其中一个重载调用另一个方法,代码如下:

public void ValidationError(string fieldName)
{ 
    ValidationError(fieldName, ValidationMessages.ContactNotFound);
}

public void ValidationError(string fieldName, string message)
{
    ...
}

这种方法还可以让你在需要时将null作为message的值传递,以便表示该参数的有效值也可以是null


13

不,您无法直接使资源在默认情况下工作。您需要做的是将默认值设置为null,然后在方法体中当参数具有默认值时进行资源查找。


这正是我担心的。我真的很喜欢它在开发时告诉开发人员字符串将是什么的便利性:http://jaxidian.org/optparam.jpg 我意识到我所要求的(编译资源文件)会破坏它存在的部分原因,但我使用它不是为了本地化和动态更改,而只是作为重复使用的字符串的公共存储。 - Jaxidian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接