Есть ли способ сделать этот метод универсальным, чтобы я мог вернуть строку, bool, int или double? Прямо сейчас он возвращает строку, но если он может найти «true» или «false» в качестве значения конфигурации, я хотел бы, например, вернуть bool.
public static string ConfigSetting(string settingName)
{
return ConfigurationManager.AppSettings[settingName];
}
c#
.net
generics
return-type
МакГайвер
источник
источник
dynamic
ключевое слово. Для этого есть затраты на производительность, но для чтения конфигурационного файла, производительность почти наверняка незначительна.Ответы:
Вам нужно сделать его универсальным методом, например так:
Но звонивший должен будет указать ожидаемый тип. Затем вы могли бы потенциально использовать
Convert.ChangeType
, предполагая, что поддерживаются все соответствующие типы:Я не совсем уверен, что все это хорошая идея, заметьте ...
источник
ConfigSettingString
,ConfigSettingBool
и т.д.) имеет преимущество метода тел, будет короче, яснее и лучше сосредоточены ,Вы можете использовать
Convert.ChangeType()
:источник
Есть много способов сделать это (перечислены в порядке приоритета, в зависимости от проблемы ОП)
Вариант 1. Прямой подход - создайте несколько функций для каждого ожидаемого типа, а не одну общую функцию.
Вариант 2. Если вы не хотите использовать причудливые методы преобразования, приведите значение к объекту, а затем к универсальному типу.
Примечание. Это приведет к ошибке, если приведение неверно (ваш случай). Я не рекомендовал бы делать это, если вы не уверены в приведении типов, лучше перейдите к варианту 3.
Вариант 3: универсальный с безопасностью типов - создайте универсальную функцию для обработки преобразования типов.
Примечание - T является ожидаемым типом, обратите внимание на ограничение where (тип U должен быть IConvertible, чтобы избавить нас от ошибок)
источник
U
? В этом нет никакого смысла, и это затрудняет вызов метода. Просто примитеIConvertible
вместо этого. Я не думаю, что стоит включить второй вариант для этого вопроса, поскольку он не отвечает на заданный вопрос. Вероятно, вам также следует переименовать метод в первом варианте ...Вы должны преобразовать тип возвращаемого значения метода в тип Generic, который вы передаете методу во время вызова.
Вам нужно передать тип, который можно преобразовать в тип для значения, возвращаемого этим методом.
Если вы хотите вернуть значение, которое не может быть преобразовано в тип к передаваемому вами универсальному типу, вам, возможно, придется изменить код или убедиться, что вы передаете тип, который является кастуемым, для возвращаемого значения метода. Таким образом, этот подход не рекомендуется.
источник
return (T)Convert.ChangeType(number, typeof(T));
была именно то, что я пропустил - ураСоздайте функцию и передайте параметр put общего типа.
источник
Пожалуйста, попробуйте ниже код:
источник
Я выполнял это по всему коду и хотел, чтобы это было в методе. Я хотел поделиться этим здесь, потому что мне не нужно было использовать Convert.ChangeType для моего возвращаемого значения. Возможно, это не лучшая практика, но это сработало для меня. Этот метод принимает массив универсального типа и значение, добавляемое в конец массива. Затем массив копируется с удалением первого значения, а значение, принятое в метод, добавляется в конец массива. Последнее, что я возвращаю общий массив.
источник