Есть ли общая функция Parse(), которая преобразует строку в любой тип, используя синтаксический анализ?
Я хочу преобразовать строку в общий тип типа int
или date
или long
на основе типичного типа возврата.
В основном функция типа Parse<T>(String)
, которая возвращает элемент типа T
.
Например, если int был передан, функция должна делать int.parse
внутренне.
Ответы
Ответ 1
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>();
Ответ 2
System.Convert.ChangeType
не конвертируется в любой тип. Подумайте о следующем:
- типы с нулевым значением
- перечислений
- Руководство и т.д.
Эти преобразования возможны с этой реализацией ChangeType.
Ответ 3
Существует несколько соглашений в .NET для преобразования объектов одного типа в другой.
Но эти методы намного медленнее, чем ваш типичный T.Parse(string)
, вызывают бокс и задействуют множество распределений каждый раз, когда вы хотите преобразовать одно значение.
Для ValueString я решил найти подходящий статический метод синтаксического анализа типа с использованием отражения, построить выражение лямбда, вызывающее его и кеш скомпилированный делегат для будущего использования (см. этот ответ для примера).
Он также отступает от способов, о которых я говорил выше, если тип не имеет подходящего метода синтаксического анализа (см. раздел производительности в ридй).
var v = new ValueString("15"); // struct
var i = v.As<int>(); // Calls int.Parse.
Ответ 4
Простой способ анализа строк.
Все переменные типа номера имеют встроенную функцию синтаксического анализа.
Пример:
Если это ваша проблема.
Console.Write("enter meal price");
double mealprice = Console.Readline();
тогда это ваш ответ.
Console.Write("enter meal price");
double mealprice =double.Parse( Console.Readline());
также работает с int
, а другие также...