【发布时间】:2018-09-20 02:17:33
【问题描述】:
我正在尝试编写一个 Roslyn 分析器来检测来自接口的特定实现的方法调用,但我在检测实现类型时遇到了问题。
当我使用类型化变量作为具体实现时,它正确识别方法,但当我使用类型化变量作为接口时,它不能正确识别方法。主要是想弄清楚如何使用 Roslyn 代码分析 API 获取接口的底层实现的类型
这是要分析的示例代码。它正确检测到第二个Operate 方法调用但不是第一个,即使两者都使用Operable 中的具体实现
using System;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
IOperable ioperable = new Operable();
ioperable.Operate();
Operable operable = new Operable();
operable.Operate();
}
}
public interface IOperable
{
void Operate();
}
public class Operable : IOperable
{
public void Operate()
{
}
}
}
这是我目前的来源:
public override void Initialize(AnalysisContext context)
{
context.RegisterSyntaxNodeAction(AnalyzeInvocation, SyntaxKind.InvocationExpression);
}
private static void AnalyzeInvocation(SyntaxNodeAnalysisContext context)
{
var invocation = (InvocationExpressionSyntax)context.Node;
var memberAccess = invocation.Expression as MemberAccessExpressionSyntax;
if (memberAccess == null || !memberAccess.IsKind(SyntaxKind.SimpleMemberAccessExpression))
{
return;
}
var ident = memberAccess.Name.Identifier;
if (ident.ToString().ToLower() != "operate")
{
return;
}
var calledFromType = context.SemanticModel.GetTypeInfo(memberAccess.Expression).Type;
if (calledFromType.MetadataName != "Operable")
{
return;
}
context.ReportDiagnostic(Diagnostic.Create(Rule, context.Node.GetLocation()));
}
【问题讨论】:
标签: c# roslyn abstract-syntax-tree analyzer roslyn-code-analysis