web-dev-qa-db-fra.com

Nom C # du type générique sans spécifier le type

Supposons que j'ai le type

public class A<T> { }

et quelque part dans le code, je souhaite lancer une exception liée à une utilisation incorrecte de ce type:

throw new InvalidOperationException("Cannot use A<T> like that.");

Jusqu'ici, tout va bien, mais je ne veux pas coder en dur le nom des classes, alors j'ai pensé que je pourrais peut-être utiliser

throw new InvalidOperationException($"Cannot use {nameof(A<T>)} like that.");

au lieu de cela, mais dans ce contexte, je ne connais pas le type exact T. J'ai donc pensé que je pourrais peut-être le faire avec une spécialisation de modèle comme en C++:

throw new InvalidOperationException($"Cannot use {nameof(A)} like that.");

ou

throw new InvalidOperationException($"Cannot use {nameof(A<>)} like that.");

mais ceux qui cèdent

Nombre incorrect de paramètres de type.

et

L'argument de type est manquant.


Je ne veux absolument pas coder en dur le nom des classes car il pourrait changer plus tard. Comment puis-je obtenir le nom de la classe, de préférence via nameof?

De manière optimale, ce que je veux réaliser est "Cannot use A<T> like that." ou "Cannot use A like that.".

7
Thomas Flinkow

Si vous ne souhaitez pas afficher T, vous pouvez simplement utiliser, par exemple, nameof(A<object>), en supposant que object respecte les contraintes de type générique.

Cela entraîne "Impossible d'utiliser A comme ça". 

Si vous voulez imprimer exactement A<T>, vous pouvez utiliser:

$"{nameof(A<T>)}<{nameof(T)}>"

Mais seulement à l'intérieur de la classe, car T n'existe pas ailleurs.

8
Rotem

Selon l'endroit où vous souhaitez lever cette exception, vous pouvez utiliser le type.

Dans l'instance, appelez this.GetType() et obtenez ensuite la propriété Name ou FullName:

throw new InvalidOperationException($"Cannot use {this.GetType().Name} like that.");
1
Patrick Hofman

As-tu essayé:

typeof(T).FullName;

ou

t.GetType().FullName;

J'espère que ça marche pour toi.

0
PachecoDt