187 votes

Comment rendre le type de retour d'une méthode générique ?

Existe-t-il un moyen de rendre cette méthode générique afin que je puisse renvoyer une chaîne de caractères, un bool, un int ou un double ? Actuellement, elle renvoie une chaîne de caractères, mais si elle est capable de trouver "true" ou "false" comme valeur de configuration, j'aimerais renvoyer un bool par exemple.

    public static string ConfigSetting(string settingName)
    {  
         return ConfigurationManager.AppSettings[settingName];
    }

394voto

Jon Skeet Points 692016

Vous devez en faire une méthode générique, comme ceci :

public static T ConfigSetting<T>(string settingName)
{  
    return /* code to convert the setting to T... */
}

Mais le appelant devront préciser le type qu'ils attendent. Vous pourriez alors potentiellement utiliser Convert.ChangeType en supposant que tous les types pertinents sont pris en charge :

public static T ConfigSetting<T>(string settingName)
{  
    object value = ConfigurationManager.AppSettings[settingName];
    return (T) Convert.ChangeType(value, typeof(T));
}

Je ne suis pas entièrement convaincu que tout cela soit une bonne idée, remarquez...

31voto

BrokenGlass Points 91618

Vous pourriez utiliser Convert.ChangeType() :

public static T ConfigSetting<T>(string settingName)
{
    return (T)Convert.ChangeType(ConfigurationManager.AppSettings[settingName], typeof(T));
}

23voto

RollerCosta Points 1264

Il existe de nombreuses façons de procéder (classées par ordre de priorité, en fonction du problème du PO).

  1. Option 1 : approche directe - Créez plusieurs fonctions pour chaque type attendu plutôt que d'avoir une seule fonction générique.

    public static bool ConfigSettingInt(string settingName)
    {  
         return Convert.ToBoolean(ConfigurationManager.AppSettings[settingName]);
    }
  2. Option 2 : Quand vous ne voulez pas utiliser des méthodes de conversion fantaisistes - Transformez la valeur en objet, puis en type générique.

    public static T ConfigSetting<T>(string settingName)
    {  
         return (T)(object)ConfigurationManager.AppSettings[settingName];
    }

    Note - Une erreur se produira si le modèle n'est pas valide (dans votre cas). Je ne vous recommande pas de faire cela si vous n'êtes pas sûr de l'encodage du type, préférez l'option 3.

  3. Option 3 : Générique avec sécurité de type - Créer une fonction générique pour gérer la conversion de type.

    public static T ConvertValue<T,U>(U value) where U : IConvertible
    {
        return (T)Convert.ChangeType(value, typeof(T));
    } 

    Note - T est le type attendu, notez la contrainte where ici (le type de U doit être IConvertible pour nous éviter les erreurs).

9voto

Vinay Chanumolu Points 75

Vous devez convertir le type de votre valeur de retour de la méthode au type générique que vous passez à la méthode lors de l'appel.

    public static T values<T>()
    {
        Random random = new Random();
        int number = random.Next(1, 4);
        return (T)Convert.ChangeType(number, typeof(T));
    }

Vous devez passer un type qui est castérable pour la valeur que vous retournez par cette méthode.

Si vous souhaitez renvoyer une valeur qui n'est pas compatible avec le type générique que vous passez, vous devrez peut-être modifier le code ou vous assurer que vous passez un type compatible avec la valeur de retour de la méthode. Cette approche n'est donc pas recommandée.

3voto

Prabhakar Points 88

Créer une fonction et passer le paramètre put comme un type générique.

 public static T some_function<T>(T out_put_object /*declare as Output object*/)
    {
        return out_put_object;
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X