I'm doing code analysis with Roslyn in order to validate that even though I have the following signature
public void MyMethod(object anObject, MyCustomObject customObject);
I only want to receive, as parameters, a string (1st) and a child from MyCustomObject (2nd). I have no power over the signature, it cannot be changed.
Here's what I did to evaluate my method (Here's a snippet)
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;
}
As of now, I can manipulate my IParameterSymbol objects from the property Parameters (symbol.Parameters). What I don't get is the following : I've gone through my result IEnumerable containing both my parameters, but because of the method signature, it expects to receive an object and a MyCustomObject instances. I'm not in a position (at the moment) to be certain that the first parameter is indeed an object and not a string (merely an example, could have been anything else) and that when I'm expecting a child of MyCustomObject, if I give it a null, I want to know it's a null parameter.
I'll be grateful to anyone who can un-stuck me from this sticky situation !
UPDATES
Here's what kind of information is given to me when I get into an 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
What you should be doing is getting the arguments (not parameters -- they are different things!) and calling SemanticModel.GetTypeInfo()
on the ArgumentSyntax. That'll give you the type of the expression being passed. From there you can do whatever checks you need.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.