如何在方法调用时找到方法参数的类型?

米尔哈尼安舍夫

假设我们有以下基本模型:

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);

在这一点上,我被卡住了。我对Roslyn比较陌生我的问题是如何找到传递给IExampleInterface.DoSomething调用的参数类型

米尔哈尼安舍夫

我实际上通过获取编译的语义模型解决了这个问题

首先,在找到所有调用者之后,我们需要借助来自SymbolCallerInfoCallingSymbol来找到InvocationExpression节点

其次,我们必须从InvocationExpression 的ArgumentList属性中获取我们感兴趣的参数

假设arg是所需的参数,而compilerarg来自的 Compilation 实例

var type = compilation
      .GetSemanticModel(arg.SyntaxTree)
      .GetTypeInfo(arg.ChildNodes().First());

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在方法调用中对参数类型使用继承?

如何在TypeScript中调用类型参数的静态方法

使用Mockito进行方法调用时如何检查方法参数?

如何调用参数类型为ILogger的方法

从函数调用时,而不是从 main 调用时,“预期类型参数,找到整数”

如何找到方法调用?

如何在不指定类的情况下使用显式类型参数调用Java方法?

如何在F#中调用因参数类型重载的方法?

在结构类型上找到静态方法后如何调用

基于参数类型的调用方法

如何在实例方法中调用类型方法

当参数是给定类型的子类时如何调用重载方法?

调用泛型方法时如何推断参数类型?

如何使用Func类型的Expression作为参数调用方法

如何在JAVA中找到方法的返回类型?

茉莉花:当具有不同参数的多个调用时,如何增加方法的期望

为什么 webapi 的 post 方法在从邮递员调用时接收类型接口的参数为 null?

链接不带句点的方法调用时“不带参数”

Laravel:控制器方法在调用时接收空参数

使用string []作为参数的方法调用时的PrivateObject NullReferenceException

Python-Tkinter-如何在命令参数中调用方法

如何在 Angular 的 ngOnInit 中调用参数化方法?

如何在Android Studio上使用View参数调用方法

如何在java反射中调用不带参数的方法

如何在Java中调用参数化方法?

如何在JavaScript事件中通过参数调用页面方法?

如何在Swift中使用CVaListPointer参数调用方法

如何在调用和检查参数之前拦截方法?

如何在Android Studio中使用View参数调用方法