我正在尝试在MVC应用程序的控制器中,将模型作为参数传递到函数中进行检测。我编写了一个Roslyn诊断分析器的代码。代码背后的逻辑是正常工作的,因为断点按预期被触发。但是,警告的诊断结果没有反映在打开的Visual Studio实例中。
以下是我的诊断分析器代码片段:
以下是我的诊断分析器代码片段:
public override void Initialize(AnalysisContext context)
{
// TODO: Consider registering other actions that act on syntax instead of or in addition to symbols
context.RegisterSyntaxNodeAction(AnalyzeSymbol, SyntaxKind.MethodDeclaration);
}
private async static void AnalyzeSymbol(SyntaxNodeAnalysisContext context)
{
var method = (MethodDeclarationSyntax)context.Node;
ParameterListSyntax ParamList = method.ParameterList;
int flag = 0;
string ParamName = null;
foreach (ParameterSyntax Param in ParamList.Parameters)
{
if (Param.Type.ToString().Contains("Model"))
{
ParamName = Param.Type.ToString();
flag = 1;
break;
}
}
if (flag == 0)
return;
string solutionPath = @"C:\Users\Administrator\Documents\Visual Studio 2015\Projects\WebApplication6\WebApplication6.sln";
var workspace = MSBuildWorkspace.Create();
var solution = await workspace.OpenSolutionAsync(solutionPath);
foreach (var project in solution.Projects)
{
foreach (var document in project.Documents)
{
CancellationToken source = default(CancellationToken);
SyntaxNode root = await document.GetSyntaxRootAsync(source);
var classDeclarations = root.DescendantNodes().Where(n => n.IsKind(SyntaxKind.ClassDeclaration));
flag = 0;
foreach (ClassDeclarationSyntax cls in classDeclarations)
{
if (cls.Identifier.Text.ToString() == ParamName)
{
var diagnostic = Diagnostic.Create(Rule, method.GetLocation());
context.ReportDiagnostic(diagnostic);
}
}
}
}
}
WebApplication6.sln
上运行你的分析器吗?如果解决方案已经在构建中,你可能会在打开MSBuildWorkspace
时遇到问题。 - JoshVarty