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."
.
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.
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.");
As-tu essayé:
typeof(T).FullName;
ou
t.GetType().FullName;
J'espère que ça marche pour toi.