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

Jer*_*vel 14 c# roslyn

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

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

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
Run Code Online (Sandbox Code Playgroud)

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

或者:是否有其他(更适合?)的方式来获得确切的类型?

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

Jas*_*ski 23

ToDisplayString方法允许您传入一个"格式"对象,该对象具有大量选项,用于控制格式化内容的方式:

var symbolDisplayFormat = new SymbolDisplayFormat(
    typeQualificationStyle: SymbolDisplayTypeQualificationStyle.NameAndContainingTypesAndNamespaces);

string fullyQualifiedName = typeSymbol.ToDisplayString(symbolDisplayFormat);
Run Code Online (Sandbox Code Playgroud)

获取像"int"这样的关键字是默认格式的原因是包含SymbolDisplayMiscellaneousOptions.UseSpecialTypes指定使用特殊类型的语言关键字与常规名称的标志.

  • 好吧,所以获取TypeInfo的Type,将命名问题放在一边,是一个棘手的问题.它假设您有一个可以加载和找到的程序集.进行构建时,编译器可能正在加载不能作为"普通"程序集加载的引用程序集.即使它们是,您可能必须挂钩AppDomain.AssemblyResolve来定位您的引用,以及您构建的任何程序集. (3认同)

and*_*dyp 5

我也找不到内置的东西,我很确定这不是最优雅的方式,但它对我来说构造一个合格的类型名称是这样的:

private static string GetQualifiedTypeName(ISymbol symbol)
{
    return symbol.ContainingNamespace 
        + "." + symbol.Name 
        + ", " + symbol.ContainingAssembly;
}
Run Code Online (Sandbox Code Playgroud)

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