【问题标题】:Roslyn / IPropertySymbol / arrary return typeRoslyn / IPropertySymbol / 数组返回类型
【发布时间】:2019-08-01 19:25:57
【问题描述】:

我正在尝试返回一个类的所有属性,以及使用 Roslyn 的每个属性的返回类型(不是反射..)

我已经接近了,但后来我遇到了一个返回字符串数组(或者可能是枚举?)的属性,我正在努力找出数组/集合中的类型......

public class msgClass // 较大类的一部分,并被引用为 Roslyn 文档
字符串 [] 行 {get; set;} //较大类属性中的属性
...

var DocumentsInProject = await roslynUtilities.GetMembers<BasePropertyDeclarationSyntax>(msgClass);

foreach (var itemClassProperty in DocumentsInProject)
{
    var itemDeclaredSymbol = semanticModelOfDoc
        .GetDeclaredSymbol(itemClassProperty) as IPropertySymbol;
    if (itemDeclaredSymbol == null)
        throw new Exception($"property: {itemClassProperty}");

    var name = itemDeclaredSymbol.Name;
    //what does it return?
    string returnType = string.Empty;

    if (itemDeclaredSymbol.Type.IsReferenceType)
    {
        var typeofKind = itemDeclaredSymbol.Type.TypeKind;
        var typeincollection = itemDeclaredSymbol.Type.BaseType;
        var containingType = itemDeclaredSymbol.Type.ContainingType.Name;
    }
    else
    {
        returnType = itemDeclaredSymbol.Type.Name;
    }
}

如果不是很明显,这不是生产代码 - 我是 Roslyn 的新手,我正在破解,并且我正在构建一个用于审查项目中的类的 Visual Studio 加载项。

【问题讨论】:

    标签: roslyn


    【解决方案1】:

    您实际上需要将属性类型符号转换为INamedTypeSymbolIArrayTypeSymbol。您可以通过INamedTypeSymbol 检查该类型是否为泛型 [un] 绑定类型,并尝试找出泛型类型参数。如果类型不仅是泛型类型,而且是集合,它将允许您接收集合的元素类型。转换为 IArrayTypeSymbol 将允许您获取数组的元素类型。所以你的代码应该是这样的:

    ...
    if (itemDeclaredSymbol.Type is INamedTypeSymbol namedType && namedType.IsGenericType)
    {
        // use namedType.TypeArguments if type is bound generic or namedType.TypeParameters if isn't
    }
    else if (itemDeclaredSymbol.Type is IArrayTypeSymbol arrayType)
    {
        // use arrayType.ElementType as you want
    }
    ...
    

    【讨论】:

    • 谢谢! - 这种转换为 ge 属性很难发现......就数组符号而言 - 我如何区分字符串和字符串 [] 或 Ienumerable
    • @codeputer, 1) 字符串和 IEnumerable`1 是 INamedTypeSymbol 当 sting[] 是 IArrayTypeSymbol 2) IEnumerable`1 是通用类型,当字符串不是 3) 你可以检查 @987654328 @ 用于比较字符串,string[] 和 IEnumerable`1 4) 您可以从ITypeSymbol 获取类型名称并进行比较
    猜你喜欢
    • 2019-01-07
    • 1970-01-01
    • 2014-05-16
    • 2015-09-10
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 2012-01-13
    相关资源
    最近更新 更多