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的建议。我没有看那些符号。将发布我的代码,以便它可以帮助其他人。