Как сделать возвращаемый тип метода общим?

Есть ли способ сделать этот метод общим, чтобы я мог возвращать строку, bool, int или double? Прямо сейчас он возвращает строку, но если он может найти "true" или "false" в качестве значения конфигурации, я бы хотел, например, вернуть bool.

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

Ответ 1

Вам нужно сделать общий метод, например:

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

Но вызывающий должен указать тип, который они ожидают. Затем вы могли бы использовать Convert.ChangeType, считая, что поддерживаются все соответствующие типы:

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

Я не совсем уверен, что все это хорошая идея, заметьте...

Ответ 2

Вы можете использовать Convert.ChangeType():

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

Ответ 3

Существует много способов сделать это (перечисленные приоритетом, специфичным для проблемы OP)

  • Вариант 1/Прямой подход. Создайте несколько функций для каждого типа, который вы ожидаете, вместо того, чтобы иметь одну общую функцию.

    public static bool ConfigSettingInt(string settingName)
    {  
         return Convert.ToBoolean(ConfigurationManager.AppSettings[settingName]);
    }
    
  • Вариант 2/Если вы не хотите использовать причудливые методы преобразования - переведите значение в объект, а затем в общий тип.

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

    Примечание.. Это приведет к ошибке, если акты недействительны (ваш случай). Я бы не рекомендовал делать это, если вы не уверены в типе кастинга, скорее зайдите на вариант 3.

  • Вариант 3/Общие с безопасностью типа. Создайте универсальную функцию для обработки преобразования типов.

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

    Примечание. T - ожидаемый тип, обратите внимание на здесь ограничение (тип U должен быть IConvertible, чтобы спасти нас от ошибок)

Ответ 4

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

Я выполнял это на протяжении всего своего кода и хотел, чтобы его можно было внедрить в метод. Я хотел бы поделиться этим здесь, потому что мне не нужно использовать Convert.ChangeType для моего возвращаемого значения. Это не может быть лучшей практикой, но это сработало для меня. Этот метод принимает массив общего типа и значение, добавляемое в конец массива. Затем массив копируется с отключенным первым значением, а значение, принятое в методе, добавляется в конец массива. Последнее, что я возвращаю общий массив.