Как сделать возвращаемый тип метода универсальным?
есть ли способ сделать этот метод универсальным, чтобы я мог вернуть строку, bool, int или double? Прямо сейчас он возвращает строку, но если он может найти "true" или "false" в качестве значения конфигурации, я хотел бы вернуть bool, например.
public static string ConfigSetting(string settingName)
{
return ConfigurationManager.AppSettings[settingName];
}
6 ответов:
вы должны сделать это общий метод, как это:
public static T ConfigSetting<T>(string settingName) { return /* code to convert the setting to T... */ }но caller придется указать тип, который они ожидают. Затем вы можете потенциально использовать
Convert.ChangeType, предполагая, что поддерживаются все соответствующие типы:public static T ConfigSetting<T>(string settingName) { object value = ConfigurationManager.AppSettings[settingName]; return (T) Convert.ChangeType(value, typeof(T)); }Я не уверен, что все это хорошая идея, заметь...
вы могли бы использовать
Convert.ChangeType():public static T ConfigSetting<T>(string settingName) { return (T)Convert.ChangeType(ConfigurationManager.AppSettings[settingName], typeof(T)); }
есть много способов сделать это(перечислены по приоритетам, специфичным для проблемы 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-ожидаемый тип, обратите внимание на ограничение where здесь (тип U должен быть IConvertible, чтобы спасти нас от ошибок)
вы должны преобразовать тип возвращаемого значения метода в универсальный тип, который вы передаете методу во время вызова.
public static T values<T>() { Random random = new Random(); int number = random.Next(1, 4); return (T)Convert.ChangeType(number, typeof(T)); }вам нужно передать тип, который является типом casteable для значения, возвращаемого через этот метод.
Если вы хотите вернуть значение, которое не является типом casteable для общего типа, который вы передаете, вам может потребоваться изменить код или убедиться, что вы передаете тип, который является casteable для возвращаемого значения метода. Итак, этот подход не рекомендуется.
создайте функцию и передайте параметр put как универсальный тип.
public static T some_function<T>(T out_put_object /*declare as Output object*/) { return out_put_object; }
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; }Я выполнял это на протяжении всего моего кода и хотел способ поместить его в метод. Я хотел поделиться этим здесь, потому что мне не нужно было использовать преобразование.Тип изменения для моего возвращаемого значения. Возможно, это не лучшая практика, но она сработала для меня. Этот метод принимает массив универсального типа и значения для добавления в конец массива. Затем массив копируется с первым удаленным значением, и значение, принятое в методе, добавляется в конец массива. Последнее дело что я возвращаю общий массив.
Comments