首页 > 解决方案 > c# 如何在VS2017 IDE中验证参数类似于string.Format

问题描述

我注意到在 VS2017 IDE 中,有如下一行

string.Format("{0}: {1}, {2}, {3}, {4}", 1, 2, 3, 4);

用绿色波浪下划线{4}突出显示。将鼠标悬停在它上面时,会显示警告“格式字符串包含无效的占位符”,这表明 VS2017 的 IDE 能够验证调用 string.Format 等函数的参数。

这很棒,因为我在编写格式字符串和参数之间不匹配的代码时会立即收到有关问题的反馈,而不是稍后在运行时的某个时间。但是,如果我使用与 string.Format 类似的原型定义自己的函数,并且在内部使用 string.Format,则不会进行参数验证。

class Example
{
  void ThrowException(string format, params object[] args)
  {
    throw new Exception(string.Format(format, args));
  }

  void LogMessage(int errorCode, string format, params object[] args)
  {
    throw new NotImplementedException("No logger!", new Exception(string.Format(format, args)));
  }

  void Main()
  {
    string.Format("{0}: {1}, {2}, {3}, {4}", 1, 2, 3, 4);
    ThrowException("{0}: {1}, {2}, {3}, {4}", 1, 2, 3, 4);
    LogMessage(0, "{0}: {1}, {2}, {3}, {4}", 1, 2, 3, 4);
  }
}

IDE 中出现的 Main() 函数

只有带有的行string.Format显示验证错误。这意味着在调用需要相同验证的自定义函数时,我只将问题检测为运行时错误。

我查看了 string.Format 的参考源,希望能够复制配置 IDE 验证的属性,但在那里没有看到任何相关内容,并且无法找出好的搜索词来查找是否已在其他地方询问过(例如,谷歌搜索确切的错误消息似乎只能找到产生错误的 Roslyn 源)

什么控制 IDE 是否对格式字符串执行此类验证,以及如何为我自己的代码(例如示例函数)启用它?

标签: c#validationvisual-studio-2017ide

解决方案


[占位符回答,直到其他人给出的答案可能比这个更好,以供以后有类似问题的访问者使用!]

总结一下我对评论中给出的答案的理解:

这在 Visual Studio 2017 中以任何合理明显的方式都是不可能的。

它需要编写自己的 Roslyn-Analyzer(由 Flat Eric 建议)或 Visual Studio Extension(由 Chetan Ranpariya 建议),并且无法简单地指示编译器使用已经为字符串编写的现有分析器。格式。

相反,我们希望要么重做 Microsoft 已经为 string.Format 所做的相同工作,对于每个具有相似参数集的函数,要么在 IDE 中没有相同级别的帮助的情况下完成工作。(我不清楚究竟有多少微软的工作需要重复,这不是我为了找出答案而打算追求的解决方案)。

JuanR 还建议在调用站点重构代码以改用字符串插值(这是我在阅读该评论时刚刚了解到的,可能值得尝试)。

我希望在设计此功能时遵循 DRY 原则,这样我就可以指示编译器使用相同的规则将众所周知的代码分析器应用于我的函数的“格式”和“参数”参数作为 string.Format 的等效参数,但这似乎还没有被设计到系统中。


推荐阅读