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

时间:2015-06-16 15:36:22

标签: c# visual-studio visual-studio-2015 hint obsolete

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

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

我想在有人拨打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

3 个答案:

答案 0 :(得分:3)

在Visual Studio 2015中,可以使用Roslyn Diagnostic(和可选的Fix)。新的Visual Studio 2015代码编辑器使用Roslyn来完成它所有的解析代码Analaysis,Metrics和Refactoring引擎现在基于它。

此类检查的示例实施是given on the Roslyn github page。完整的实现对于StackOverflow的答案有点多,因为它需要经过许多步骤并相当于一个完整的教程,但这是something similar is given here的完整教程。并可能是您工作的基础。 (稍后再问一些问题)。 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,并在未编译时发出警告。当它是一个常量字符串时发出警告会更简单。

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

如果您希望代码编辑器中的某些内容不使用任何扩展或自定义,那么向codoc添加<remark />就像您可以做的那样多。在最糟糕的情况下,您可以在方法中加入Debug.Assert(input != "|");,这样开发人员就会在开发/调试时获得他们错误地使用您的API的预警。

答案 1 :(得分:1)

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

除外

强调评论

:)

/// <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中产生提示的任何其他方法,但它们仅由预定义的构建参数(例如{{1等等)他们直接进入错误列表。

Btw&amp;只是为了好玩:您可以通过添加默认值

来解决您的示例
#IF DEBUG

编辑: jessehouwing答案要好得多,这整个答案或多或少都是关于精力充沛的评论的笑话:)

答案 2 :(得分:-3)

使用单引号

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