C# 使用Roslyn获取类定义的泛型属性类型的名称
我有一个定义如下的类:C# 使用Roslyn获取类定义的泛型属性类型的名称,c#,roslyn,C#,Roslyn,我有一个定义如下的类: class Derived { public int t { get; set; } public List<Child> Childs { get; set; } } 其中节点是一个ClassDeclarationSyntax 此代码适用于属性t;返回属性类型的名称System.Int32。但是,对于属性Childs(它是一个带有泛型参数的类型),我得到了一个nulltypeSymbol,这不是该属性所期望的System.type 如何使用
class Derived
{
public int t { get; set; }
public List<Child> Childs { get; set; }
}
其中节点是一个ClassDeclarationSyntax
此代码适用于属性t
;返回属性类型的名称System.Int32
。但是,对于属性Childs
(它是一个带有泛型参数的类型),我得到了一个nulltypeSymbol
,这不是该属性所期望的System.type
如何使用Roslyn从类定义中获取泛型类型的属性类型?您应该使用
SemanticModel.GetTypeInfo
而不是SemanticModel.GetSymbolInfo
从节点检索相应的ITypeSymbol
:
...
foreach (var property in properties)
{
var info = context.SemanticModel.GetTypeInfo(property);
var typeSymbol = info.Type ?? info.ConvertedType;
...
}
如果需要泛型的(第一)参数类型,可以使用:
TypeSyntax type=(property.type作为GenericNameSyntax.TypeArgumentList.Arguments[0];
您的派生类
看起来不是很派生。是的,我只是简化了类定义。它是否是派生的对于这个问题来说并不重要。System.Type
用于运行时类型;Roslyn在INamedTypeSymbol
中有自己的类型系统。context.SemanticModel.GetSymbolInfo(property.type).Symbol
的运行时类型是什么?我确信您需要尝试SemanticModel.GetTypeInfo
而不是SemanticModel.GetSymbolInfo
来检索itTypeSymbol
...
foreach (var property in properties)
{
var info = context.SemanticModel.GetTypeInfo(property);
var typeSymbol = info.Type ?? info.ConvertedType;
...
}