Как сделать тип возвращаемого значения для метода универсальным? - PullRequest
137 голосов
/ 21 марта 2012

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

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

Ответы [ 7 ]

303 голосов
/ 21 марта 2012

Вы должны сделать его универсальным методом, например так:

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));
}

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

25 голосов
/ 21 марта 2012

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

public static T ConfigSetting<T>(string settingName)
{
    return (T)Convert.ChangeType(ConfigurationManager.AppSettings[settingName], typeof(T));
}
8 голосов
/ 12 декабря 2017

Есть много способов сделать это (перечислены по приоритету, в зависимости от проблемы ОП)

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

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

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

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

  3. Вариант 3: универсальный с типом безопасности - Создатьуниверсальная функция для обработки преобразования типов.

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

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

6 голосов
/ 05 июня 2018

Вы должны преобразовать тип вашего возвращаемого значения метода в тип Generic, который вы передаете методу во время вызова.

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

Вам необходимо передать тип, который можно преобразовать в тип для значениявы вернетесь через этот метод.

Если вы хотите вернуть значение, которое не может быть преобразовано в тип к передаваемому вами универсальному типу, вам, возможно, придется изменить код или убедиться, что вы передаете тип, который может быть преобразован для возвращаемого значения метода.Таким образом, этот подход не рекомендуется.

0 голосов
/ 05 ноября 2018

Пожалуйста, попробуйте ниже код:

public T? GetParsedOrDefaultValue<T>(string valueToParse) where T : struct, IComparable
{
 if(string.EmptyOrNull(valueToParse))return null;
  try
  {
     // return parsed value
     return (T) Convert.ChangeType(valueToParse, typeof(T));
  }
  catch(Exception)
  {
   //default as null value
   return null;
  }
 return null;
}
0 голосов
/ 18 сентября 2018

Создайте функцию и передайте положенный параметр как универсальный тип.

 public static T some_function<T>(T out_put_object /*declare as Output object*/)
    {
        return out_put_object;
    }
0 голосов
/ 18 июля 2017
 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 для моего возвращаемого значения.Возможно, это не лучшая практика, но это сработало для меня.Этот метод принимает массив универсального типа и значение, добавляемое в конец массива.Затем массив копируется с удалением первого значения, а значение, взятое в метод, добавляется в конец массива.Последнее, что я возвращаю общий массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...