我的类定义如下:
class Derived
{
public int t { get; set; }
public List<Child> Childs { get; set; }
}
我想为该类的每个属性获取System.Type
。这是我目前所拥有的:
var properties = node.DescendantNodes().OfType<PropertyDeclarationSyntax>();
var symbolDisplayFormat = new SymbolDisplayFormat(
typeQualificationStyle: SymbolDisplayTypeQualificationStyle.NameAndContainingTypesAndNamespaces
);
foreach (var property in properties)
{
var typeSymbol = context.SemanticModel.GetSymbolInfo(property.Type).Symbol as INamedTypeSymbol;
string name = typeSymbol.ToDisplayString(symbolDisplayFormat);
}
其中节点是ClassDeclarationSyntax
。
此代码对于属性t
正常工作;属性类型的名称将返回System.Int32
。但是,对于属性Childs
(它是带有通用参数的类型),我得到一个空的typeSymbol
,而不是预期的该属性的System.Type
。
如何使用Roslyn从类定义中获取泛型类型的属性的类型?
答案 0 :(得分:0)
您应该使用SemanticModel.GetTypeInfo
而不是SemanticModel.GetSymbolInfo
从节点中检索相应的ITypeSymbol
:
...
foreach (var property in properties)
{
var info = context.SemanticModel.GetTypeInfo(property);
var typeSymbol = info.Type ?? info.ConvertedType;
...
}
答案 1 :(得分:0)
如果要使用泛型的(第一个)参数类型,可以使用:
TypeSyntax type = (property.Type as GenericNameSyntax).TypeArgumentList.Arguments[0];