首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从TypeInfo对象获取类型的完全限定名

从TypeInfo对象获取类型的完全限定名
EN

Stack Overflow用户
提问于 2014-04-26 01:39:13
回答 3查看 4.6K关注 0票数 20

是否有可能获得包含在TypeInfo对象中的类型的完全限定名?

在调试器中,这些值中有许多很好地显示为System.Int32,但是当打印出来时,其中没有一个包含这个完全限定的名称。我需要这个作为Type.GetType()的一个参数。

代码语言:javascript
复制
var typeInfo = semanticModel.GetTypeInfo(argument);
var w = typeInfo.ToString(); // Microsoft.CodeAnalysis.TypeInfo
var y = typeInfo.Type.ToString(); // int
var z = typeInfo.Type.ToDisplayString(); // int 
var a = typeInfo.Type.OriginalDefinition.ToDisplayString(); // int
var b = typeInfo.Type.OriginalDefinition.ToString(); // int
var c = typeInfo.Type.Name; // Int32
var d = typeInfo.Type.MetadataName; // Int32
var e = typeInfo.Type.ToDisplayParts(); // {int}
var f = typeInfo.Type.ContainingNamespace; // System

请注意,这应该适用于每种类型,因此我不能仅仅将名称空间与名称连接起来。

或者:还有其他的(更合适的)吗?怎样才能得到确切的类型?

对于上下文:我想检查类的类型参数是否包含一些特定的方法。因此,我的方法是从TypeArgumentListSyntax获取参数,并从每个TypeSyntax对象获取TypeInfo

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-04-26 18:31:55

ToDisplayString方法允许您传递一个" format“对象,该对象有大量的选项来控制您想要格式化的内容:

代码语言:javascript
复制
var symbolDisplayFormat = new SymbolDisplayFormat(
    typeQualificationStyle: SymbolDisplayTypeQualificationStyle.NameAndContainingTypesAndNamespaces);

string fullyQualifiedName = typeSymbol.ToDisplayString(symbolDisplayFormat);

获得像"int“这样的关键字的原因是默认格式包括SymbolDisplayMiscellaneousOptions.UseSpecialTypes标志,它指定将语言关键字用于特殊类型和常规名称。

票数 32
EN

Stack Overflow用户

发布于 2014-04-26 08:57:37

我也找不到内置的东西,而且我确信这不是最优雅的方法,但我可以这样构造一个合格的类型名称:

代码语言:javascript
复制
private static string GetQualifiedTypeName(ISymbol symbol)
{
    return symbol.ContainingNamespace 
        + "." + symbol.Name 
        + ", " + symbol.ContainingAssembly;
}

如果不需要程序集限定类型名称,请不要在最后一行的末尾连接ContainingAssembly

票数 5
EN

Stack Overflow用户

发布于 2017-03-28 14:49:25

使用语义模型,您也可以像我在这里所做的那样:

代码语言:javascript
复制
var typeInfo = context.SemanticModel.GetTypeInfo(identifierNameSyntax);
var namedType = typeInfo.Type as INamedTypeSymbol;
if (namedType != null && namedType.Name == nameof(ConfiguredTaskAwaitable) && GetFullNamespace(namedType) == typeof(ConfiguredTaskAwaitable).Namespace)
    return true;

"GetFullNamespace“的工作方式如下:

代码语言:javascript
复制
    public static IEnumerable<string> GetNamespaces(INamedTypeSymbol symbol)
    {
        var current = symbol.ContainingNamespace;
        while (current != null)
        {
            if (current.IsGlobalNamespace)
                break;
            yield return current.Name;
            current = current.ContainingNamespace;
        }
    }

    public static string GetFullNamespace(INamedTypeSymbol symbol)
    {
        return string.Join(".", GetNamespaces(symbol).Reverse());
    }

    public static string GetFullTypeName(INamedTypeSymbol symbol)
    {
        return string.Join(".", GetNamespaces(symbol).Reverse().Concat(new []{ symbol.Name }));
    }

显然,的答案对于简单的案例来说更方便

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23305594

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档