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

时间:2015-08-13 09:48:57

标签: c# visual-studio-2015 code-analysis roslyn

我试图找出是否有办法获取方法参数的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),但无法深入挖掘INTO Type1以获取属性。

有没有简单的方法可以获得我尚未意识到的内容?或者我是否必须使用我所获得的类型的名称再次在整个解决方案中进行搜索?

非常感谢!

P.S。:我确实想过使用Reflection,但我所拥有的只是一个字符串(Type1),而不是实际的TYPE。不确定我是否可以使用它。

更新-1: This question似乎与我的期望略微接近但是根据我的理解,用户只需要参数类型的名称,而不是它的内在的信息。

更新-2:从我的工具中添加示例代码。不幸的是,我无法发布实际代码,但下面的示例基本上就是我想要做的。 Update-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?
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

感谢@ 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
    }

}

希望这有帮助!