我正在努力提高编码感,所以我开始为我正在使用的类型添加一些扩展方法。
我发现,我经常使用相同的属性做同样的动作。
我想在有人拨打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
。答案 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进行修复,并将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向后兼容的内容,则可以选择编写自定义代码分析规则。此example rule将输入调用Regex.Match
和Regex.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);