CA1303,DoNotPassLiteralsAsLocalizedParameters,但实际上并非如此

时间:2012-03-21 12:45:46

标签: .net winforms visual-studio-2010 localization fxcop

我的代码从CA1303获取Microsoft.Globalization警告,“不要将文字作为本地化参数传递”,但我的代码实际上没有传递文字< /强>:

private void MyForm_Load(object sender, EventArgs e)
{
    UpdateTitle();
}

private void UpdateTitle()
{
    Version version = Assembly.GetExecutingAssembly().GetName().Version;
    CultureInfo culture = CultureInfo.CurrentUICulture;
    this.Text = String.Format(culture, "{0} v{1}.{2} Alpha r{3}", this.Text, version.Major, version.Minor, version.Build);
}

每次加载时,此代码都会将表单的标题设置为类似的内容:

  

MyFormNameAsSetInTheDesigner v0.1 Alpha r123

version.build实际上包含SVN修订版,它在每次提交时自动更新,我不使用revision因为我的版本控制方案只使用3个数字,major.minor.revision

但这会触发上述警告,因为它认为我是从字符串文字设置标题栏文本。实际上,我在设计器中设置了Localizable = True,因此从资源表中提取字符串

我不想静态设置表单的标题,因为(特别是在alpha和beta阶段)我希望它具有动态版本号。

问题是我该怎么办,所以我没有得到警告(例如,哪些代码会执行我正在做的事情,但根据FxCop被认为是正确的,或者我怎么能为该行压制它。)< / H3>

2 个答案:

答案 0 :(得分:7)

基于CA1303的documentation,引发警告的原因是您将文字字符串作为String.Format方法的第二个参数传递,另外还有第二个形式参数特殊重载使用LocalizableAttribute进行注释。

因此,警告您要做的是将字符串"{0} v{1}.{2} Alpha r{3}"作为资源程序集中的本地化资源,并将其作为参考。这可能是一个好主意,因为从技术上讲,格式字符串的结构及其内容的固定部分可本地化的资源。

如果您只是想让FxCop闭嘴,您可以相应地annotate UpdateTitle

[SuppressMessage("Microsoft.Globalization",
                 "CA1303:DoNotPassLiteralsAsLocalizedParameters" )]
private void UpdateTitle() { /* ... */ }

答案 1 :(得分:0)

忽略此警告的一般方法是将以下内容添加到您的.csproj文件中:

<NoWarn>CA1303</NoWarn>