Существует ли какая-либо универсальная функция Parse (), которая преобразует строку в любой тип, используя parse? - PullRequest
73 голосов
/ 17 августа 2010

Я хочу преобразовать строку в универсальный тип, такой как int или date или long, в зависимости от универсального типа возвращаемого значения.

В основном это функция типа Parse<T>(String), которая возвращает элементвведите T.

Например, если передано значение int, функция должна выполнить int.parse внутри.

Ответы [ 5 ]

106 голосов
/ 17 августа 2010

System.Convert.ChangeType

В соответствии с вашим примером вы можете сделать:

int i = (int)Convert.ChangeType("123", typeof(int));
DateTime dt = (DateTime)Convert.ChangeType("2009/12/12", typeof(DateTime));

Чтобы удовлетворить ваше требование "универсального типа возврата", вы могли бынапишите свой собственный метод расширения:

public static T ChangeType<T>(this object obj)
{
    return (T)Convert.ChangeType(obj, typeof(T));
}

Это позволит вам сделать:

int i = "123".ChangeType<int>();
14 голосов
/ 03 апреля 2018

Похоже, я слишком поздно отвечаю на эту тему.Но вот моя реализация:

По сути, я создал метод Extention для класса Object.Он обрабатывает все типы, т. Е. Обнуляемые, классы и структуры.

 public static T ConvertTo<T>(this object value)
           {
               T returnValue;

               if (value is T variable)
                   returnValue = variable;
               else
                   try
                   {
                       //Handling Nullable types i.e, int?, double?, bool? .. etc
                       if (Nullable.GetUnderlyingType(typeof(T)) != null)
                       {
                           TypeConverter conv = TypeDescriptor.GetConverter(typeof(T));
                           returnValue = (T) conv.ConvertFrom(value);
                       }
                       else
                       {
                           returnValue = (T) Convert.ChangeType(value, typeof(T));
                       }
                   }
                   catch (Exception)
                   {
                       returnValue = default(T);
                   }

               return returnValue;
           }
10 голосов
/ 15 апреля 2012

System.Convert.ChangeType не конвертируется ни в какой тип. Подумайте о следующем:

  • Обнуляемые типы
  • перечисления
  • Гид и т. Д.

Эти преобразования возможны с этой реализацией ChangeType .

5 голосов
/ 19 июля 2018

более чистая версия ответ Пранай

public static T ConvertTo<T>(this object value)
{
    if (value is T variable) return variable;

    try
    {
        //Handling Nullable types i.e, int?, double?, bool? .. etc
        if (Nullable.GetUnderlyingType(typeof(T)) != null)
        {
            return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(value);
        }

        return (T)Convert.ChangeType(value, typeof(T));
    }
    catch (Exception)
    {
        return default(T);
    }
}
0 голосов
/ 17 ноября 2017

В .NET существует несколько соглашений для преобразования объектов одного типа в другой.

Но эти методы намного медленнее, чем ваш обычный T.Parse(string), вызывают бокс и требуют большого количества выделений каждый раз, когда вы хотите преобразовать одно значение.

Для ValueString я решил найти подходящий статический метод синтаксического анализа типа, использующий отражение, создать лямбда-выражение, вызывающее его, и кэшировать скомпилированный делегат для будущего использования (см. этот ответ для примера).

Это также отступление от способов, которые я упомянул выше, если у типа нет подходящего метода синтаксического анализа (см. Раздел производительности *1027* в файле readme).

var v = new ValueString("15"); // struct
var i = v.As<int>(); // Calls int.Parse.
...