是否有可能获得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指定使用特殊类型的语言关键字与常规名称的标志.
我也找不到内置的东西,我很确定这不是最优雅的方式,但它对我来说构造一个合格的类型名称是这样的:
private static string GetQualifiedTypeName(ISymbol symbol)
{
return symbol.ContainingNamespace
+ "." + symbol.Name
+ ", " + symbol.ContainingAssembly;
}
Run Code Online (Sandbox Code Playgroud)
如果不需要程序集限定类型名称,请不要ContainingAssembly在最后一行的末尾连接。