使用 Roslyn 获取方法参数类型的内部细节
Get inner details of the TYPE of a method parameter using Roslyn
我想知道是否有办法获取方法参数类型的内部细节。
假设一个方法具有以下定义
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;}
}
然后我希望从示例工具中得到的是 class Type1
的属性列表。也就是说,我希望我的输出是
prop1
prop2
prop3
我可以通过执行 param.Type
来获取对参数的引用,但它的类型是 IdentifierNameSyntax
。我能够从中获取名称(在本例中为 Type1
),但无法深入挖掘 INTO Type1
以获取属性。
有什么简单的方法可以得到我还不知道的东西吗?或者我是否必须使用我得到的类型的名称再次在整个解决方案中进行搜索?
非常感谢!
P.S.: 我确实想到了使用 Reflection
但我只有一个字符串 (Type1
) 而不是实际类型。不确定我是否可以使用它。
Update-1: 似乎与我的预期稍微接近,但据我了解,用户只想要参数的名称类型,而不是内部细节。
Update-2: 从下面的工具中添加示例代码。不幸的是,我无法 post 实际代码,但下面的示例基本上就是我想要做的。
Update-2:从下面的工具中添加示例代码。不幸的是,我无法 post 实际代码,但下面的示例基本上就是我想要做的。
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。您关于使用 Symbols 的建议奏效了。这是我下面的代码,它返回了我期望的结果。
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
}
}
希望对您有所帮助!
我想知道是否有办法获取方法参数类型的内部细节。
假设一个方法具有以下定义
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;}
}
然后我希望从示例工具中得到的是 class Type1
的属性列表。也就是说,我希望我的输出是
prop1
prop2
prop3
我可以通过执行 param.Type
来获取对参数的引用,但它的类型是 IdentifierNameSyntax
。我能够从中获取名称(在本例中为 Type1
),但无法深入挖掘 INTO Type1
以获取属性。
有什么简单的方法可以得到我还不知道的东西吗?或者我是否必须使用我得到的类型的名称再次在整个解决方案中进行搜索?
非常感谢!
P.S.: 我确实想到了使用 Reflection
但我只有一个字符串 (Type1
) 而不是实际类型。不确定我是否可以使用它。
Update-1:
Update-2: 从下面的工具中添加示例代码。不幸的是,我无法 post 实际代码,但下面的示例基本上就是我想要做的。 Update-2:从下面的工具中添加示例代码。不幸的是,我无法 post 实际代码,但下面的示例基本上就是我想要做的。
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。您关于使用 Symbols 的建议奏效了。这是我下面的代码,它返回了我期望的结果。
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
}
}
希望对您有所帮助!