使用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?
}
找到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
}
}
希望这对你有帮助!