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