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

cra*_*opy 9 c# hint obsolete visual-studio visual-studio-2015

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


我想通了,我经常使用相同的属性做同样的动作.

我想在有人打电话时显示这个提示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);
    }
}
Run Code Online (Sandbox Code Playgroud)

同位语:

  • 当然,提示可能会显示Obsolete代码(0618/ CS0618),但这对我来说并不重要.我只是希望得到提示!
  • 我工作C# 6.0,.NET 4.6Visual Studio 2015 RC.

jes*_*ing 3

在 Visual Studio 2015 中,可以使用 Roslyn 诊断(和可选的修复)来实现这一点。新的 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());
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Resharper 和 CodeRush 等 Visual Studio 扩展提供了一个 SDK,可以执行与 FxCop 类似的操作,但它们像 Roslyn 一样嵌入到 IDE 中。采取这种方法可能是您的一个选择。

如果您希望代码编辑器中的某些内容不使用任何扩展或自定义,那么将 a 添加<remark />到 codedoc 就可以了。在最坏的情况下,您可以在方法中添加 a Debug.Assert(input != "|");,这样开发人员就会收到早期警告(在开发/调试时),表明他们错误地使用了您的 API。