Предположим, у нас есть следующая базовая модель:
public class Base
{
...
}
и M 1 , ..., M n моделей, полученных из этой.
У нас есть интерфейс со следующей структурой:
public interface IExampleInterface
{
void DoSomething(Base input);
}
И предположим, у нас есть простая реализация для этого класса, например, такая:
public class Example : IExampleInterface
{
void DoSomething(Base input)
{
System.Console.WriteLine("Please help me!!");
}
}
Там Есть много вызовов IExampleInterface.DoSomething метода с различными входными аргументами в решении.
var ex = new Example();
var m = new M();
ex.DoSometing(m);
, где M может быть любого типа от M 1 , ..., M n .
Мне удалось найти интерфейс из дерева синтаксиса, его реализацию и параметр типы, даже больше я нашел вызывающих, но у меня проблемы с поиском типа передаваемых аргументов в вызовах IExampleInterface.DoSomething .
Вот код:
var interfaceName = "IExampleInterface";
var returnType = "Void";
var methodName = "DoSomething";
var arg = "Base";
var exInterface = compilations
.SelectMany(compilation => compilation.SyntaxTrees.Select(syntaxTree => compilation.GetSemanticModel(syntaxTree)))
.SelectMany(
semanticModel => semanticModel
.SyntaxTree
.GetRoot()
.DescendantNodes()
.OfType<InterfaceDeclarationSyntax>()
.Select(interfaceDeclarationSyntax => semanticModel.GetDeclaredSymbol(interfaceDeclarationSyntax)))
.Where(s => s.Name == interfaceName)
.FirstOrDefault();
var implementations = await SymbolFinder.FindImplementationsAsync(exInterface, solution);
var implementation = implementations.FirstOrDefault() as ITypeSymbol;
var method = exInterface
.GetMembers(methodName)
.Where(m => m.Kind == SymbolKind.Method)
.Cast<IMethodSymbol>()
.FirstOrDefault(m =>
m.Parameters != null &&
m.Parameters.Length == 1 &&
m.Parameters[0].Type.Name == arg &&
m.ReturnType.Name == returnType);
var callers = await SymbolFinder.FindCallersAsync(method, solution);
На данный момент я застрял. Я относительно новичок в Рослин . У меня вопрос, как найти тип аргументов, передаваемых на IExampleInterface.DoSomething вызовов?