Есть ли какая-либо общая функция Parse (), которая преобразует строку в любой тип с помощью parse?
Я хочу преобразовать строку в универсальный тип, например int
или date
или long
на основе общего типа возвращаемого значения.
в основном функция, как Parse<T>(String)
Это возвращает элемент типа T
.
например, если int был передан функция должна делать int.parse
внутренне.
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 есть несколько соглашений для преобразования объектов одного типа в другой.
- преобразовать.Тип изменения если тип реализует IConvertible
- TypeDescriptor.GetConverter если типа TypeConverterAttribute
но эти методы намного медленнее, чем ваш типичный
T.Parse(string)
, вызвать бокс и включать много выделений каждый раз, когда вы хотите преобразовать одно значение.на ValueString, я решил найти подходящий, статический метод разбора типа с использованием отражения, построить лямбда-выражение, вызывающее его, и кэшировать скомпилированный делегат для дальнейшего использования (см. ответ для примера).
Он также возвращается к способам, которые я упоминал выше, если тип не имеет подходящего метода синтаксического анализа (см. раздел в readme).
var v = new ValueString("15"); // struct var i = v.As<int>(); // Calls int.Parse.