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

How to show a specific hint within Visual Studio

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


我发现,我经常做同样的动作,而且总是具有相同的属性。

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

The char you want to remove is |. Use the RemoveNewLine() extension without any attributes instead.

我尝试使用 [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);
    }
}

同位素:

使用单引号

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

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

除外

强调评论

:)

/// <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) {...}

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

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

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

编辑: 答案好多了,整个答案或多或少是关于 热烈评论 的笑话: )

在 Visual Studio 2015 年,这可以使用 Roslyn 诊断(和可选的修复)。新的 Visual Studio 2015 代码编辑器在引擎盖下使用 Roslyn 来完成所有解析工作,代码分析、指标和重构引擎现在基于它。

此类检查的示例实施是 given on the Roslyn github page. A full implementation would be a bit much for an answer here on Whosebug, as it entails a number of steps to go through and amounts to a complete tutorial, but this full tutorial of something similar is given here. and may be the basis for your work. (ask additional questions later). Code for the standard rules that ship with the product can be found in the Roslyn GitHub as well

这段代码应该让你很接近,但我还没有测试过。根据 Roslyn SDK totorial 创建标准诊断和修复,并将 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 向后兼容的东西,您可以选择编写自定义代码分析规则。此 example rule 接受对 Regex.MatchRegex.Replace 的调用的输入,并在未编译时发出警告。如果是常量字符串,直接警告就更简单了

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

如果您想要在代码编辑器中使用不使用任何扩展或自定义的内容,那么向代码文档添加 <remark /> 就差不多可以了。在最坏的情况下,您可以在方法中放入一个 Debug.Assert(input != "|");,这样开发人员将得到早期警告(在 development/debug 时间)他们错误地使用了您的 API。