Comment comparer un Microsoft.CodeAnalysis.ITypeSymbol à un System.Type

J’ai reçu avec succès un ITypeSymbol d’un SyntaxNode en utilisant:

SemanticModel.GetTypeInfo(sytaxNode).ConvertedType 

Maintenant, j’aimerais savoir si cet ITypeSymbol correspond à une instance System.Type présente dans mon code d’exécution, comme typeof(IEnumerable) ou someObject.GetType() .

j’ai essayé

 typeInfo.ConvertedType.ToSsortingng() == type.ToSsortingng() 

Mais ceux-ci n’utilisent pas les mêmes règles de formatage, par exemple pour des génériques comme IEnumerable

TypeInfo.ToSsortingng() == "System.Collections.Generic.IEnumerable"

tandis que

 typeof(IEnumerable).ToSsortingng() == "System.Collections.Generic.IEnumerable`1[System.Int32]" 

De plus, je pense qu’il serait préférable de comparer AssemblyQualifiedNames au lieu de simplement l’espace de noms et le nom du nom pour éviter d’éventuels conflits de noms.

Idéalement, j’aimerais pouvoir obtenir dans mon code d’exécution l’instance actuelle System.Type qui correspond à l’ITypeInfo que j’ai obtenue du modèle sémantique (à condition que l’assembly requirejs soit chargé et / ou disponible). Cela permettrait de vérifier si le type est assignable à partir d’un autre type, etc.

Vous pouvez obtenir le INamedTypeSymbol pour un nom de type avec Compilation.GetTypeByMetadataName() .

Alors essayez ceci:

 semanticModel.GetTypeInfo(sytaxNode).ConvertedType.Equals( semanticModel.Compilation.GetTypeByMetadataName(typeof(WhateverType).FullName)) 

Cela ne fonctionnera pas avec les types génériques fermés, pour ceux que vous devrez faire un peu plus. Par exemple:

 var ienumerableType = semanticModel.Compilation.GetTypeByMetadataName("System.Collections.Generic.IEnumerable`1"); var intType = semanticModel.Compilation.GetTypeByMetadataName("System.Int32"); var type = ienumerableType.Construct(intType); 

Sur la base de la réponse de @Tamas, j’ai créé la solution récursive suivante qui fonctionne pour les types génériques fermés.

  static bool TypeSymbolMatchesType(ITypeSymbol typeSymbol, Type type, SemanticModel semanticModel) { return GetTypeSymbolForType(type, semanticModel).Equals(typeSymbol); } static INamedTypeSymbol GetTypeSymbolForType(Type type, SemanticModel semanticModel) { if (!type.IsConstructedGenericType) { return semanticModel.Compilation.GetTypeByMetadataName(type.FullName); } // get all typeInfo's for the Type arguments var typeArgumentsTypeInfos = type.GenericTypeArguments.Select(a => GetTypeSymbolForType(a, semanticModel)); var openType = type.GetGenericTypeDefinition(); var typeSymbol = semanticModel.Compilation.GetTypeByMetadataName(openType.FullName); return typeSymbol.Construct(typeArgumentsTypeInfos.ToArray()); }