При использовании context.RegisterOperationAction(AnalyzeOperationAction, OperationKind.Invocacy); я способен подключаться ко всему в форме x = test.doSth() и может получать довольно много информации из семантического контекста, например test, doSth(), doSth() принадлежит классу XY, doSth() возвращает строку и т. д.
Однако я хочу знать тип теста — просто используя информацию doSth() принадлежит классу XY. не будет работать для методов расширения.
полный пример:
Код: Выделить всё
class TestClazz
{
public List test2 { get; set; }
}
static void Main(string[] args)
{
var test = new TestClazz();
var x = test.test2.ToArray();
}
р>
Код: Выделить всё
private static void AnalyzeOperationAction(OperationAnalysisContext context)
{
var wholeExpression = context.Operation.Syntax; // test.test2.ToArray()
var instance = wholeExpression.GetFirstToken(); // test
//Invalid: 'Microsoft.CodeAnalysis.SyntaxToken' to 'Microsoft.CodeAnalysis.SyntaxNode'
var type = context.Operation.SemanticModel.GetSymbolInfo(instance);
var diagnostic = Diagnostic.Create(MissingInitCallDescriptor, context.Operation.Syntax.GetLocation(), type);
context.ReportDiagnostic(diagnostic);
}
Я в основном хочу проверить этот тест является экземпляром TestClazz перед выполнением реальных проверок и созданием диагностики.
Подробнее здесь: https://stackoverflow.com/questions/787 ... invoked-on