Come faccio a rendere generico il tipo di ritorno di un metodo?

C’è un modo per rendere questo metodo generico così posso restituire una stringa, bool, int o double? In questo momento, restituisce una stringa, ma se è in grado di trovare “true” o “false” come valore di configurazione, mi piacerebbe restituire un bool, ad esempio.

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

Devi renderlo un metodo generico, come questo:

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

Ma il chiamante dovrà specificare il tipo che si aspettano. Potresti quindi utilizzare potenzialmente Convert.ChangeType , assumendo che tutti i tipi rilevanti siano supportati:

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

Non sono del tutto convinto che tutto ciò sia una buona idea, badate bene …

È ansible utilizzare Convert.ChangeType() :

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

Ci sono molti modi per farlo (elencati per priorità, specifici per il problema dell’OP)

  1. Opzione 1: approccio diretto: crea più funzioni per ogni tipo che ti aspetti piuttosto che avere una funzione generica.

     public static bool ConfigSettingInt(string settingName) { return Convert.ToBoolean(ConfigurationManager.AppSettings[settingName]); } 
  2. Opzione 2: quando non si desidera utilizzare metodi di conversione di fantasia, eseguire il cast del valore su object e quindi su tipo generico.

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

    Nota – Questo genererà un errore se il cast non è valido (il tuo caso). Non consiglierei di farlo se non sei sicuro del tipo di casting, piuttosto vai per l’opzione 3.

  3. Opzione 3: Generico con sicurezza del tipo – Crea una funzione generica per gestire la conversione del tipo.

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

    Nota: T è il tipo previsto, notare il vincolo where qui (il tipo di U deve essere IConvertible per salvarci dagli errori)

Devi convertire il tipo del tuo valore di ritorno del metodo nel tipo Generico che passi al metodo durante la chiamata.

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

È necessario passare un tipo digitato per il valore restituito tramite tale metodo.

Se si desidera restituire un valore che non è castabile al tipo generico che si passa, potrebbe essere necessario modificare il codice o assicurarsi di passare un tipo che è castabile per il valore di ritorno del metodo. Quindi, questo approccio non è raccomandato.

  private static T[] prepareArray(T[] arrayToCopy, T value) { Array.Copy(arrayToCopy, 1, arrayToCopy, 0, arrayToCopy.Length - 1); arrayToCopy[arrayToCopy.Length - 1] = value; return (T[])arrayToCopy; } 

Stavo facendo questo in tutto il mio codice e volevo un modo per metterlo in un metodo. Volevo condividere questo qui perché non dovevo usare Convert.ChangeType per il mio valore di ritorno. Questo potrebbe non essere una buona pratica, ma ha funzionato per me. Questo metodo utilizza una matrice di tipo generico e un valore da aggiungere alla fine dell’array. L’array viene quindi copiato con il primo valore stripped e il valore preso nel metodo viene aggiunto alla fine dell’array. L’ultima cosa è che restituisco l’array generico.