C# 使用Roslyn获取方法参数类型的内部详细信息

C# 使用Roslyn获取方法参数类型的内部详细信息,c#,visual-studio-2015,code-analysis,roslyn,C#,Visual Studio 2015,Code Analysis,Roslyn,我试图找出是否有办法获得方法参数类型的内部细节 假设一个方法具有以下定义 public void method1(Type1 param1, Type2 param2) { ... ... } public class Type1 { public int prop1 {get; set;} public string prop2 {get; set;} public double prop3 {get; set;} } 而Type1的定义如下 publi

我试图找出是否有办法获得方法参数类型的内部细节

假设一个方法具有以下定义

public void method1(Type1 param1, Type2 param2)
{
   ...
   ...
}
public class Type1
{
    public int prop1 {get; set;}
    public string prop2 {get; set;}
    public double prop3 {get; set;}
}
Type1
的定义如下

public void method1(Type1 param1, Type2 param2)
{
   ...
   ...
}
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
获取属性

有什么简单的方法可以得到我还不知道的东西吗?或者我必须使用得到的类型名称再次搜索整个解决方案吗

非常感谢

p.S.:我确实想过使用
反射
,但我只有一个字符串(
Type1
),而不是实际的类型。不知道我是否能用这个

Update-1:似乎有点接近我的预期,但据我所知,用户只需要参数类型的名称,而不是其内部细节

更新-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?
}

找到
参数syntax
后,使用
语义模型.GetDeclaredSymbol
获取
IParameterSymbol
,然后查看其
类型
,获取感兴趣的
ITypeSommbol

感谢@Serj Tm、@KevinPilch Bisson和@jonsket。你关于使用符号的建议奏效了。下面是我的代码,它返回了我期望的结果

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
    }

}
var methodNode=(MethodDeclarationSyntax)节点;
string modelClassName=string.Empty;
foreach(methodNode.ParameterList.Parameters中的var param)
{
var metaDataName=document.GetSemanticModelAsync().Result.GetDeclaredSymbol(param.ToDisplayString();
//“文档”是当前的“Microsoft.CodeAnalysis.document”对象
var members=document.Project.GetCompilationAsync().Result.GetTypeByMetadataName(metaDataName).GetMembers();
var props=(members.OfType());
//现在“props”包含我的类型“Type1”中的属性列表
foreach(道具中的var道具)
{
//在每个项目上做一些事情的逻辑
}
}

希望这有帮助

您可能希望查看符号,而不是语法。如果你能告诉我们你的代码的上下文,你会更容易得到帮助…@JonSkeet更新了代码。请检查。右侧-查看Serj Tm链接到的问题。基本上是一样的-您希望通过语义模型获取符号信息。@Serj Tm您共享的链接基本上再次执行完整的解决方案搜索。但我想知道是否还有别的办法,因为当我的程序在上面的代码时,它已经在搜索的中间。因此,我希望避免在搜索中启动另一个搜索:)是的,这正是我所做的。:)谢谢:)也谢谢@Serj Tm的建议。我没有看那些符号。将发布我的代码,以便它可以帮助其他人。