如何在 Visual Studio 中显示特定提示

本文关键字:显示 提示 Studio Visual | 更新日期: 2023-09-27 17:56:38

我目前正在努力提高我的编码感觉,所以我已经开始为我正在使用的类型添加一些扩展方法。


发现,我经常使用相同的属性做同样的动作。

当有人打电话给ReplaceNewLine("|")时,我想显示这个提示:

要删除的字符是 | .请改用不带任何属性的RemoveNewLine()扩展。

我尝试使用 [Obsolete(...)] 属性,但每次调用函数时都会显示出来。

我的问题是:如何根据我在 Visual Studio 中的输入显示特定的提示?

法典:

public static class StringExtension
{
    public static string ReplaceNewLine(this string s)
    {
        return s.Replace("|", Environment.NewLine);
    }
    // show hint if c is |
    public static string ReplaceNewLine(this string s, string c)
    {
        return s.Replace(c, Environment.NewLine);
    }
}

同位:

  • 当然,提示在显示时可能有Obsolete代码(0618/CS0618),但这对我来说并不重要。我只是想显示提示!
  • 我正在与C# 6.0.NET 4.6Visual Studio 2015 RC合作。

如何在 Visual Studio 中显示特定提示

在Visual Studio 2015中,可以使用Roslyn Diagnostic (和可选的Fix)来实现这一点。新的Visual Studio 2015代码编辑器使用Roslyn来解析代码分析,指标和重构引擎现在基于它。

Roslyn github页面上给出了此类检查的示例实现。在 StackOverflow 上,一个完整的实现会有点多,因为它需要完成许多步骤并且相当于一个完整的教程,但这里给出了类似内容的完整教程。并且可能是您工作的基础。(稍后再问其他问题)。产品附带的标准规则代码也可以在 Roslyn GitHub 中找到。

这段代码应该让你非常接近,但我还没有测试过它。根据 Roslyn SDK 拓扑创建标准诊断和修复,并将InitializeAnalyzeNode方法替换为(将命名空间替换为自己的命名空间):

public override void Initialize(AnalysisContext context)
{
    context.RegisterSyntaxNodeAction(AnalyzeSyntaxNode, SyntaxKind.InvocationExpression);
}
private void AnalyzeSyntaxNode(SyntaxNodeAnalysisContext context)
{
    InvocationExpressionSyntax invocationExpression = context.Node as InvocationExpressionSyntax;
    IMethodSymbol methodSymbol = context.SemanticModel.GetSymbolInfo(invocationExpression).Symbol as IMethodSymbol;
    if (
        methodSymbol != null
        && methodSymbol.Name == "ReplaceNewline" 
        && methodSymbol.ContainingNamespace.Name == "MySampleFix"
        && methodSymbol.OriginalDefinition.Parameters.Length == 1)
    {
        if (invocationExpression.ArgumentList.Arguments.Count() == 1)
        {
            LiteralExpressionSyntax arg =
                invocationExpression.ArgumentList.Arguments[0].Expression as LiteralExpressionSyntax;
            if (arg != null && arg.Token.ValueText == "|")
            {
                Diagnostic.Create(Rule, invocationExpression.GetLocation());
            }
        }
    }
}

如果要使某些内容向后兼容旧版本的Visual Studio,则可以选择编写自定义代码分析规则。此示例规则将输入用于调用 Regex.MatchRegex.Replace,并在未编译时发出警告。当它是常量字符串时发出警告会更简单。

像Resharper和CodeRush这样的Visual studio扩展提供了一个SDK,它可以做类似于FxCop的事情,但它们像Roslyn一样嵌入到IDE中。您可能可以选择采用这种方法。

如果您希望代码编辑器中不使用任何扩展或自定义的内容,那么向 codedoc 添加<remark />几乎是您可以做的。在最坏的情况下,您可以在方法中输入Debug.Assert(input != "|");,这样开发人员将获得早期警告(在开发/调试时)他们不正确地使用您的 API。

我认为这是不可能的,只有

强调评论

:)

/// <summary>
/// Replace specific char with <see cref="Environment.NewLine"/>
/// </summary>
/// <param name="s">input</param>
/// <param name="c">If the char is "|", use the extension method without any parameter instead (<see cref="StringExtension.ReplaceNewLine()" />).</param>
/// <returns>something with maybe new lines.</returns>
public static string ReplaceNewLine(this string s, string c) {...}

我不知道任何其他方法可以在纯Visual Studio中生成提示,除了#warning msg(和#pragma),但它们仅由预定义的构建参数(如#IF DEBUG等)限定,并且它们直接进入错误列表。

顺便说一句,只是为了好玩:你可以通过添加默认值来解决你的例子

public static class StringExtension
{
    public static string ReplaceNewLine(this string s, string c = "|")
    {
        return s.Replace(c, Environment.NewLine);
    }
}

编辑:jessehouwing的答案要好得多,整个答案或多或少是一个关于激烈评论的笑话:)

使用单引号

return s.Replace('|', Environment.NewLine);