使用Roslyn获取方法参数TYPE的内部细节

本文关键字:内部 细节 TYPE 参数 Roslyn 获取 方法 使用 | 更新日期: 2023-09-27 18:07:36

我想知道是否有一种方法可以获得方法参数TYPE的内部细节。

假设一个方法有如下定义

public void method1(Type1 param1, Type2 param2)
{
   ...
   ...
}

Type1有如下定义

public class Type1
{
    public int prop1 {get; set;}
    public string prop2 {get; set;}
    public double prop3 {get; set;}
}

然后我想从我的示例工具中得到的是类Type1的属性列表。也就是说,我希望我的输出是

prop1 
prop2 
prop3

我可以通过执行param.Type来获得对参数的引用,但它的类型是IdentifierNameSyntax。我能够从中获得名称(在本例中为Type1),但无法深入挖掘Type1以获取属性。

有什么简单的方法可以得到我还不知道的东西吗?还是我需要用我得到的类型名在整个解中再搜索一次?

非常感谢!

注::我确实想到了使用Reflection,但我所拥有的只是一个字符串(Type1)而不是实际的TYPE。我不确定我是否可以使用这个。

Update-1:这个问题似乎有点接近我所期望的,但从我的理解,用户只想要参数类型的名称,而不是它的内部细节。

Update-2:从下面的工具添加示例代码。不幸的是,我不能张贴实际的代码,但下面的样本基本上是我想做的。更新-2:从下面的工具添加示例代码。不幸的是,我不能发布实际的代码,但下面的示例基本上是我想做的。

var methodNode = (MethodDeclarationSyntax)node;
string paramClassName = string.Empty;
foreach (var param in methodNode.ParameterList.Parameters)
{
    paramClassName = param.Type.ToFullString();
    //GET Class details from the above class name
    GetInnerDetailsOfClassFromClassName(paramClassName);   //any way to do this?
}

使用Roslyn获取方法参数TYPE的内部细节

找到ParameterSyntax后,使用SemanticModel.GetDeclaredSymbol获得IParameterSymbol,然后查看其Type以获得您感兴趣的ITypeSymbol

感谢@Serj-Tm, @KevinPilch-Bisson和@JonSkeet。你使用符号的建议起作用了。下面是我的代码,它返回了我所期望的结果。

var methodNode = (MethodDeclarationSyntax)node;
string modelClassName = string.Empty;
foreach (var param in methodNode.ParameterList.Parameters)
{
    var metaDataName = document.GetSemanticModelAsync().Result.GetDeclaredSymbol(param).ToDisplayString();
//'document' is the current 'Microsoft.CodeAnalysis.Document' object
    var members = document.Project.GetCompilationAsync().Result.GetTypeByMetadataName(metaDataName).GetMembers();
    var props = (members.OfType<IPropertySymbol>());
    //now 'props' contains the list of properties from my type, 'Type1'
    foreach (var prop in props)
    {
        //some logic to do something on each proerty
    }
}

希望这对你有帮助!