Comment puis-je faire le type de retour d'une méthode générique?
Est-il un moyen de rendre cette méthode générique pour que je puisse retourner un string, bool, int, ou double? Maintenant, elle retourne une chaîne de caractères, mais si elle est en mesure de trouver des "vrais" ou "faux" comme la valeur de configuration, j'aimerais retourner un booléen par exemple.
public static string ConfigSetting(string settingName)
{
return ConfigurationManager.AppSettings[settingName];
}
- Est-il un moyen pour vous de savoir quel type de chaque paramètre est?
- Je pense que la question que vous voulez vraiment à se poser est "Comment puis-je faire ma demande de config fortement typées?" Ça fait trop longtemps depuis que j'ai travaillé avec des que pour écrire une réponse.
- Yah, idéalement, je ne veux pas avoir à passer le type dans la méthode. Je vais seulement avoir les 4 types que j'ai mentionnés. Donc, si "true"/"false" est réglé, je veux que cette fonction pour retourner un booléen (sans avoir besoin de passer dans la méthode), je peux probablement combiner int et double en double, et tout le reste doit être une chaîne de caractères. Qu'est-ce que déjà répondu fonctionne correctement, mais j'ai besoin de passer le taper à chaque fois, ce qui est probablement très bien.
- Votre commentaire semble que vous allez avoir une méthode qui retourne un typage fort bool (ou string ou int, ou qu'avez-vous) lors de l'exécution sur la base des données extraites pour le nom du paramètre clé. C# ne pas le faire pour vous; il n'y a aucun moyen de savoir le type de cette valeur au moment de la compilation. En d'autres termes, c'est la dynamique de frappe, pas de typage statique. C# peut le faire pour vous si vous utilisez le
dynamic
mot-clé. Il y a un coût à ça, mais à la lecture d'un fichier de configuration, la performance coût est presque certainement insignifiant.
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de faire une méthode générique, comme ceci:
Mais la appelant devrez spécifier le type de ce qu'ils attendent. Vous pouvez éventuellement utiliser
Convertir.ChangeType
, en supposant que tous les types sont pris en charge:Je ne suis pas entièrement convaincu que tout cela est une bonne idée, vous l'esprit...
ConfigSettingString
,ConfigSettingBool
, etc.) a l'avantage de la méthode des organes qui sera court, plus clair et mieux ciblées.ConfigurationManager.AppSettings[settingName]
renvoie toujours une chaîne de caractères, ainsi que le casting serait un échec siT
est rien d'autre queobject
,string
ou d'une interface, il prend en charge.Vous pouvez utiliser
Convert.ChangeType()
:Il y a beaucoup de façons de le faire(énumérés par ordre de priorité, spécifiques à l'OP du problème)
Option 1: Droit de l'approche - Créer de multiples fonctions pour chaque type d'attendre plutôt que d'avoir une fonction générique.
Option 2: si vous ne voulez pas utiliser de fantaisie méthodes de conversion - convertir la valeur de l'objet, puis de type générique.
Note - Cela provoquera une erreur si le casting n'est pas valide(votre cas). Je ne recommanderais pas faire cela si vous n'êtes pas certain du type de casting, plutôt aller pour l'option 3.
Option 3: Generic type de sécurité - Créer une fonction générique pour gérer la conversion de type.
Note - T est le type attendu, note le où la contrainte(type de U doit être IConvertible pour nous sauver de l'erreur)
U
? Il n'y a aucun point à le faire, et il rend la méthode plus difficile à prévoir. Juste accepterIConvertible
à la place. Je ne pense pas que cela vaut la peine, y compris la deuxième option pour cette question, étant donné qu'il ne répond pas à la question posée. Vous devriez également renommer la méthode dans la première option...Vous devez convertir le type de valeur de retour de la méthode pour le type Générique qui vous passez à la méthode au cours de l'appel.
Vous avez besoin de passer d'un type qui est le type casteable pour la valeur de retour par le biais de cette méthode.
Si vous voulez retourner une valeur qui n'est pas de type casteable pour le type générique vous passez, vous pourriez avoir à modifier le code ou assurez-vous que vous passez d'un type qui est casteable pour la valeur de retour de la méthode. Ainsi, cette approche n'est pas recommandée.
return (T)Convert.ChangeType(number, typeof(T));
était exactement ce que j'étais en manque, cheersCréer une fonction et passer mettre paramètre de type générique.
S'il vous plaît essayer de code ci-dessous :
J'ai été l'exécution de cette tout au long de mon code et je voulais un moyen de le mettre dans une méthode. Je voulais partager cela ici parce que je n'ai pas eu à utiliser le Convertir.ChangeType pour mon retour de la valeur. Cela peut ne pas être une bonne 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 dépouillé et la valeur prise dans la méthode est ajoutée à la fin du tableau. La dernière chose est que je reviens le générique de tableau.