Есть ли какая-либо общая функция Parse (), которая преобразует строку в любой тип с помощью parse?


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

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

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

5 63

5 ответов:

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

  • типы nullable
  • метки
  • Guid и др.

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

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

в принципе, я создал метод расширения для класса Object. Он обрабатывает все типы, т. е. nullable, классы и структуры.

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

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

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

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

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

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

Он также возвращается к способам, которые я упоминал выше, если тип не имеет подходящего метода синтаксического анализа (см. раздел в readme).

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