Existe-t-il un moyen de rendre cette méthode générique afin que je puisse renvoyer une chaîne, un booléen, un entier ou un double? Pour le moment, il renvoie une chaîne, mais s'il est capable de trouver "true" ou "false" comme valeur de configuration, je voudrais renvoyer un bool par exemple.
public static string ConfigSetting(string settingName)
{
return ConfigurationManager.AppSettings[settingName];
}
c#
.net
generics
return-type
MacGyver
la source
la source
dynamic
mot - clé. Il y a un coût de performance pour cela, mais pour la lecture d'un fichier de configuration, le coût de performance est presque certainement insignifiant.Réponses:
Vous devez en faire une méthode générique, comme ceci:
Mais l' appelant devra spécifier le type auquel il s'attend. Vous pourriez alors potentiellement utiliser
Convert.ChangeType
, en supposant que tous les types pertinents sont pris en charge:Je ne suis pas entièrement convaincu que tout cela soit une bonne idée, remarquez ...
la source
ConfigSettingString
,ConfigSettingBool
, etc.) a l'avantage des corps de la méthode qui sera plus courte, plus claire et mieux ciblée .Vous pouvez utiliser
Convert.ChangeType()
:la source
Il existe de nombreuses façons de procéder (classées par priorité, spécifiques au problème du PO)
Option 1: approche directe - Créez plusieurs fonctions pour chaque type attendu plutôt que d'avoir une fonction générique.
Option 2: lorsque vous ne souhaitez pas utiliser de méthodes de conversion sophistiquées - Convertissez la valeur en objet, puis en type générique.
Remarque - Cela générera une erreur si la distribution n'est pas valide (votre cas). Je ne recommanderais pas de faire cela si vous n'êtes pas sûr du type de casting, optez plutôt pour l'option 3.
Option 3: Générique avec sécurité de type - Créez une fonction générique pour gérer la conversion de type.
Remarque - T est le type attendu, notez la contrainte where ici (le type de U doit être IConvertible pour nous sauver des erreurs)
la source
U
? Cela ne sert à rien et cela rend la méthode plus difficile à appeler. Acceptez simplement à laIConvertible
place. Je ne pense pas qu'il vaut la peine d'inclure la deuxième option pour cette question étant donné qu'elle ne répond pas à la question posée. Vous devriez probablement également renommer la méthode dans la première option ...Vous devez convertir le type de votre valeur de retour de la méthode en type générique que vous passez à la méthode lors de l'appel.
Vous devez transmettre un type de type castable pour la valeur que vous renvoyez via cette méthode.
Si vous souhaitez renvoyer une valeur qui ne peut pas être convertie en type générique que vous passez, vous devrez peut-être modifier le code ou vous assurer de transmettre un type pouvant être converti en valeur de retour de method. Donc, cette approche n'est pas recommandée.
la source
return (T)Convert.ChangeType(number, typeof(T));
était exactement ce qui me manquait -Créez une fonction et transmettez le paramètre put en tant que type générique.
la source
Veuillez essayer le code ci-dessous:
la source
J'exécutais cela tout au long de mon code et je voulais un moyen de le mettre dans une méthode. Je voulais partager ceci ici car je n'avais pas besoin d'utiliser le Convert.ChangeType pour ma valeur de retour. Ce n'est peut-être pas une meilleure pratique, mais cela a fonctionné pour moi. Cette méthode prend un tableau de type générique et une valeur à ajouter à la fin du tableau. Le tableau est ensuite copié avec la première valeur supprimée et la valeur prise en compte dans la méthode est ajoutée à la fin du tableau. La dernière chose est que je renvoie le tableau générique.
la source