我正在与Roslyn进行代码分析,以便验证这一点,即使我有以下签名
public void MyMethod(object anObject, MyCustomObject customObject);
我只想接收一个字符串(第一个)和一个来自MyCustomObject的子对象(第二个)作为参数。我无权管理签名,不能更改。
以下是我为评估我的方法所做的(以下是一个片段)
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;
}
到目前为止,我可以从属性Parameters(symbol.Parameters)操作我的IParameterSymbol对象。我没有得到以下信息:我已经查看了包含两个参数的结果IEnumerable,但由于方法签名,它希望接收一个对象和一个MyCustomObject实例。我(目前)无法确定第一个参数确实是一个对象,而不是字符串(只是一个例子,可能是其他任何东西),并且当我期望MyCustomObject的子对象时,如果我给它一个null,我想知道它是一个null参数。
我将感谢任何能让我摆脱困境的人!
更新
以下是当我进入ArgumentSyntax对象时,会给我什么样的信息:
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()
。这将为您提供要传递的表达式的类型。从那里你可以做任何你需要的检查。