使用Roslyn获取类定义的通用属性类型的名称

时间:2018-07-16 18:44:50

标签: c# roslyn

我的类定义如下:

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从类定义中获取泛型类型的属性的类型?

2 个答案:

答案 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];