如何在 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.6
和Visual Studio 2015 RC
合作。
在Visual Studio 2015中,可以使用Roslyn Diagnostic (和可选的Fix)来实现这一点。新的Visual Studio 2015代码编辑器使用Roslyn来解析代码分析,指标和重构引擎现在基于它。
Roslyn github页面上给出了此类检查的示例实现。在 StackOverflow 上,一个完整的实现会有点多,因为它需要完成许多步骤并且相当于一个完整的教程,但这里给出了类似内容的完整教程。并且可能是您工作的基础。(稍后再问其他问题)。产品附带的标准规则代码也可以在 Roslyn GitHub 中找到。
这段代码应该让你非常接近,但我还没有测试过它。根据 Roslyn SDK 拓扑创建标准诊断和修复,并将Initialize
和AnalyzeNode
方法替换为(将命名空间替换为自己的命名空间):
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.Match
和 Regex.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);