La meilleure façon de tester si un type générique est une chaîne de caractères? (C#)
J'ai une classe générique qui devraient permettre à tout type primitif ou autrement. Le seul problème avec ceci est à l'aide de default(T)
. Lorsque vous appelez par défaut sur une valeur de type ou une chaîne de caractères, il initialise une valeur raisonnable (comme une chaîne vide). Lorsque vous appelez default(T)
sur un objet, elle renvoie null. Pour diverses raisons, nous devons nous assurer que, s'il n'est pas un type primitif, alors nous aurons une instance par défaut du type, pas null. Voici tentative 1:
T createDefault()
{
if(typeof(T).IsValueType)
{
return default(T);
}
else
{
return Activator.CreateInstance<T>();
}
}
Problème - chaîne n'est pas un type de valeur, mais il ne possède pas de constructeur sans paramètre. Donc, la solution actuelle est:
T createDefault()
{
if(typeof(T).IsValueType || typeof(T).FullName == "System.String")
{
return default(T);
}
else
{
return Activator.CreateInstance<T>();
}
}
Mais cela se sent comme une bidouille. Est-il une plus belle façon de gérer la chaîne de cas?
Vous devez vous connecter pour publier un commentaire.
Gardez à l'esprit que par défaut(string) est nulle, pas de chaîne.Vide. Vous voudrez peut-être un cas spécial dans votre code:
is
mot-clé? N'est-ce pas de l'utiliser ici ?Non testés, mais la première chose qui vient à l'esprit.
Vous pouvez utiliser le TypeCode énumération. Appelez le GetTypeCode méthode sur des classes qui implémentent l'IConvertible interface pour obtenir le code de type d'une instance de cette classe. IConvertible est mis en œuvre par Boolean, SByte, Byte, Int16, UInt16, Int32 UInt32, Int64, UInt64, Single, Double, Decimal, DateTime, Char et String, de sorte que vous pouvez vérifier pour les types primitifs à l'aide de ce. Plus d'infos sur "Générique Vérification De Type".
Personnellement, j'aime la surcharge de méthode:
La discussion de Chaîne ne fonctionne pas ici.
J'avais dû le code suivant pour les génériques pour le faire fonctionner -
String
par nom, surtout sans les considérer d'un espace de noms est mauvais. Et je n'aime pas la façon dont vous convertir.