是否有可能获得包含在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请注意,这应该适用于每种类型,因此我不能仅仅将名称空间与名称连接起来。
或者:还有其他的(更合适的)吗?怎样才能得到确切的类型?
对于上下文:我想检查类的类型参数是否包含一些特定的方法。因此,我的方法是从TypeArgumentListSyntax获取参数,并从每个TypeSyntax对象获取TypeInfo。
发布于 2014-04-26 18:31:55
ToDisplayString方法允许您传递一个" format“对象,该对象有大量的选项来控制您想要格式化的内容:
var symbolDisplayFormat = new SymbolDisplayFormat(
typeQualificationStyle: SymbolDisplayTypeQualificationStyle.NameAndContainingTypesAndNamespaces);
string fullyQualifiedName = typeSymbol.ToDisplayString(symbolDisplayFormat);获得像"int“这样的关键字的原因是默认格式包括SymbolDisplayMiscellaneousOptions.UseSpecialTypes标志,它指定将语言关键字用于特殊类型和常规名称。
发布于 2014-04-26 08:57:37
我也找不到内置的东西,而且我确信这不是最优雅的方法,但我可以这样构造一个合格的类型名称:
private static string GetQualifiedTypeName(ISymbol symbol)
{
return symbol.ContainingNamespace
+ "." + symbol.Name
+ ", " + symbol.ContainingAssembly;
}如果不需要程序集限定类型名称,请不要在最后一行的末尾连接ContainingAssembly。
发布于 2017-03-28 14:49:25
使用语义模型,您也可以像我在这里所做的那样:
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“的工作方式如下:
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 }));
}显然,的答案对于简单的案例来说更方便
https://stackoverflow.com/questions/23305594
复制相似问题