使用 Roslyn 时如何验证方法中的参数类型
How to validate a parameter's type in method when using Roslyn
我正在使用 Roslyn 进行代码分析以验证这一点,即使我具有以下签名
public void MyMethod(object anObject, MyCustomObject customObject);
我只想从 MyCustomObject(第 2 个)接收字符串(第 1 个)和 child 作为参数。我对签名没有权力,无法更改。
这是我对我的方法所做的评估(这是一个片段)
public void OnMethodInvocation(SyntaxNodeAnalysisContext context)
{
var invocation= context.Node as InvocationExpressionSyntax;
var symbol = context.SemanticModel.GetSymbolInfo(invocation).Symbol as IMethodSymbol;
if (symbol?.Name.ToString()== "MyMethod")
{
var parameterList = invocation.Parameters;
}
截至目前,我可以从 属性 参数 (symbol.Parameters) 操纵我的 IParameterSymbol object。我没有得到的是以下内容:我已经浏览了包含我的两个参数的结果 IEnumerable,但是由于方法签名,它期望接收一个 object 和一个 MyCustomObject 实例。我无法(目前)确定第一个参数确实是一个 object 而不是一个字符串(仅仅是一个例子,可能是其他任何东西)并且当我期待一个child 的 MyCustomObject,如果我给它一个 null,我想知道它是一个 null 参数。
如果有人能un-stuck让我摆脱这种棘手的局面,我将不胜感激!
更新
这是我进入 ArgumentSyntax object 时提供给我的信息类型:
ArgumentSyntax Argument exception
ContainsAnnotations: false
ContainsDiagnostics: false
ContainsDirectives: false
ContainsSkippedText: false
Expression: IdentifierNameSyntax IdentifierName exception
FullSpan: {[550..559)}
HasLeadingTrivia: false
HasStructuredTrivia: false
HasTrailingTrivia: false
IsMissing: false
IsStructuredTrivia: false
KindText: "Argument"
Language: "C#"
NameColon: null
Parent (Microsoft.CodeAnalysis.SyntaxNode): ArgumentListSyntax ArgumentList (exception,exception)
ParentTrivia: SyntaxTrivia None
RawKind: 8638
RefOrOutKeyword: SyntaxToken None
Span: {[550..559)}
SpanStart: 550
您应该做的是获取参数(不是参数——它们是不同的东西!)并在 ArgumentSyntax 上调用 SemanticModel.GetTypeInfo()
。这将为您提供传递的表达式的类型。从那里你可以做任何你需要的检查。
我正在使用 Roslyn 进行代码分析以验证这一点,即使我具有以下签名
public void MyMethod(object anObject, MyCustomObject customObject);
我只想从 MyCustomObject(第 2 个)接收字符串(第 1 个)和 child 作为参数。我对签名没有权力,无法更改。
这是我对我的方法所做的评估(这是一个片段)
public void OnMethodInvocation(SyntaxNodeAnalysisContext context)
{
var invocation= context.Node as InvocationExpressionSyntax;
var symbol = context.SemanticModel.GetSymbolInfo(invocation).Symbol as IMethodSymbol;
if (symbol?.Name.ToString()== "MyMethod")
{
var parameterList = invocation.Parameters;
}
截至目前,我可以从 属性 参数 (symbol.Parameters) 操纵我的 IParameterSymbol object。我没有得到的是以下内容:我已经浏览了包含我的两个参数的结果 IEnumerable,但是由于方法签名,它期望接收一个 object 和一个 MyCustomObject 实例。我无法(目前)确定第一个参数确实是一个 object 而不是一个字符串(仅仅是一个例子,可能是其他任何东西)并且当我期待一个child 的 MyCustomObject,如果我给它一个 null,我想知道它是一个 null 参数。
如果有人能un-stuck让我摆脱这种棘手的局面,我将不胜感激!
更新
这是我进入 ArgumentSyntax object 时提供给我的信息类型:
ArgumentSyntax Argument exception
ContainsAnnotations: false
ContainsDiagnostics: false
ContainsDirectives: false
ContainsSkippedText: false
Expression: IdentifierNameSyntax IdentifierName exception
FullSpan: {[550..559)}
HasLeadingTrivia: false
HasStructuredTrivia: false
HasTrailingTrivia: false
IsMissing: false
IsStructuredTrivia: false
KindText: "Argument"
Language: "C#"
NameColon: null
Parent (Microsoft.CodeAnalysis.SyntaxNode): ArgumentListSyntax ArgumentList (exception,exception)
ParentTrivia: SyntaxTrivia None
RawKind: 8638
RefOrOutKeyword: SyntaxToken None
Span: {[550..559)}
SpanStart: 550
您应该做的是获取参数(不是参数——它们是不同的东西!)并在 ArgumentSyntax 上调用 SemanticModel.GetTypeInfo()
。这将为您提供传递的表达式的类型。从那里你可以做任何你需要的检查。