Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于字符串比较的Roslyn分析器_C#_Roslyn_Code Analysis - Fatal编程技术网

C# 用于字符串比较的Roslyn分析器

C# 用于字符串比较的Roslyn分析器,c#,roslyn,code-analysis,C#,Roslyn,Code Analysis,我想写一个用于字符串比较的roslyn分析器。 个案包括: s1可以是字符串。 如果s1等于(s2)或s1==s2;它应该固定为string.equals(s1、s2、stringcompassion.Ordinal) 我对tree有了基本的了解,还需要创建一个Analyzer文件和一个CodeFixProvider类 因此,我尝试获取例如s1.equals(s2)的语法树 现在为了编写Analyze代码方法,我不知道如何验证s1是否是字符串。所以我需要帮助 我正在努力跟随这篇文章 例如 Cla

我想写一个用于字符串比较的roslyn分析器。 个案包括: s1可以是字符串。 如果s1等于(s2)或s1==s2;它应该固定为string.equals(s1、s2、stringcompassion.Ordinal)

我对tree有了基本的了解,还需要创建一个Analyzer文件和一个CodeFixProvider类

因此,我尝试获取例如s1.equals(s2)的语法树

现在为了编写Analyze代码方法,我不知道如何验证s1是否是字符串。所以我需要帮助

我正在努力跟随这篇文章

例如

Class{
  string s1 = "one";
  string s2 = "two";
  bool res = one.equals(two);
}
应重构为:

Class{
  string s1 = "one";
  string s2 = "two";
  bool res = string.equals(one,two, StringComparsion.Ordinal);
}

您可以检查规则MA0006的实现:

您还可以查看我关于字符串比较的帖子,了解其他字符串分析器:

[DiagnosticanAnalyzer(LanguageNames.CSharp)]
公共密封类UseStringEqualAnalyzer:DiagnosticanAnalyzer
{
公共覆盖无效初始化(AnalysisContext上下文)
{
context.enableCcurrentExecution();
ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
RegisterOperationAction(AnalyzeInvocation,OperationKind.BinaryOperator);
}
专用静态无效分析调用(OperationAnalysisContext上下文)
{
var operation=(IBinaryOperation)context.operation;
如果(operation.OperatorKind==BinaryOperatorKind.Equals||
operation.OperatorKind==BinaryOperatorKind.NotEquals)
{
if(operation.leftOperator.Type.IsString()&&operation.RightOperator.Type.IsString())
{
if(IsNull(operation.leftOperator)| | IsNull(operation.righOperator))
返回;
//EntityFramework Core不支持StringComparison并对客户端的所有内容进行评估。。。
// https://github.com/aspnet/EntityFrameworkCore/issues/1222
if(operation.isinexpressionagument())
返回;
ReportDiagnostic(s_规则,操作,$“{operation.OperatorKind}操作符”);
}
}
}
专用静态布尔为空(IOOperation操作)
{
返回operation.ConstantValue.HasValue&&operation.ConstantValue.Value==null;
}
}

您可以检查规则MA0006的实现情况:

您还可以查看我关于字符串比较的帖子,了解其他字符串分析器:

[DiagnosticanAnalyzer(LanguageNames.CSharp)]
公共密封类UseStringEqualAnalyzer:DiagnosticanAnalyzer
{
公共覆盖无效初始化(AnalysisContext上下文)
{
context.enableCcurrentExecution();
ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
RegisterOperationAction(AnalyzeInvocation,OperationKind.BinaryOperator);
}
专用静态无效分析调用(OperationAnalysisContext上下文)
{
var operation=(IBinaryOperation)context.operation;
如果(operation.OperatorKind==BinaryOperatorKind.Equals||
operation.OperatorKind==BinaryOperatorKind.NotEquals)
{
if(operation.leftOperator.Type.IsString()&&operation.RightOperator.Type.IsString())
{
if(IsNull(operation.leftOperator)| | IsNull(operation.righOperator))
返回;
//EntityFramework Core不支持StringComparison并对客户端的所有内容进行评估。。。
// https://github.com/aspnet/EntityFrameworkCore/issues/1222
if(operation.isinexpressionagument())
返回;
ReportDiagnostic(s_规则,操作,$“{operation.OperatorKind}操作符”);
}
}
}
专用静态布尔为空(IOOperation操作)
{
返回operation.ConstantValue.HasValue&&operation.ConstantValue.Value==null;
}
}

请注意,如果您只是想让此分析器在您自己的代码上运行,而对实际编写代码不太感兴趣,那么这已经在Microsoft编写的分析器中实现了:

安装说明可在以下位置获得:


我们的代码也可以使用,但是如果您确实希望简单的代码开始理解分析器,那么@meziantou的答案就是一个很好的例子。

请注意,如果您只是希望让此分析器在自己的代码上运行,而对实际编写它不太感兴趣,那么Microsoft编写的分析器中已经实现了这一点:

安装说明可在以下位置获得:


我们的代码也可以使用,但是如果您确实希望简单的代码开始理解分析器,那么@meziantou的答案就是一个很好的例子。

旁注:虽然有良好的教育经验,但我不认为您试图实现的是代码的改进。。。如果在表达式树中使用,可以很容易地破坏代码…旁注2:“string”不是“const”的对立面-您可能需要进行编辑以澄清您的意思:对将是“const”/“variable”和“string/”除string以外的任何其他类型“@AlexeiLevenkov我更新了它,你能解释一下它是如何破解密码的吗?我只是更改比较类型,而不是整个代码。你重写了类似于
Equals
的东西,它很可能不起作用……那么什么会起作用呢?我需要得到s1Side的数据类型注意:虽然有很好的教育经验,但我不认为您试图实现的是代码的改进。。。如果在表达式树中使用,可以很容易地破坏代码……旁注2:“string”不是“const”的反义词-您可能需要编辑以澄清您的意思:对将是“const”/“variable”和“string/”除string以外的任何其他类型。@AlexeiLevenkov I