Код: Выделить всё
public class Worker {
public void DoSomeWork(string value)
where T : struct, IComparable, IEquatable { ... }
}
Я подумал, что мог бы попробовать использовать Convert.ChangeType(), но есть проблема: если он не преобразуется, он выдаст исключение и Я буду запускать метод DoSomeWork() достаточно часто, чтобы не полагаться на попытку/вылов, чтобы определить, действительно ли преобразование.
Итак, это заставило меня задуматься: я знаю, что буду работать с числовыми типами, следовательно, T будет любым из следующих: int, uint, short, ushort, long, ulong, byte, sbyte, десятичное, плавающее, двойное. Зная это, я подумал, что можно было бы найти более быстрое решение, учитывая тот факт, что я знаю, что буду использовать числовые типы (обратите внимание, что если T не является числовым типом, я выдаю исключение). .
Код: Выделить всё
public class NumericWorker {
public void DoSomeWork(string value)
where T : struct, IComparable, IEquatable
{
ParseDelegate tryConverter =
SafeConvert.RetreiveNumericTryParseDelegate();
...
}
}
public class SafeConvert
{
public delegate bool ParseDelegate(string value, out T result);
public static ParseDelegate RetreiveNumericTryParseDelegate()
where T : struct, IComparable, IEquatable
{
ParseDelegate tryParseDelegate = null;
if (typeof(T) == typeof(int))
{
tryParseDelegate = (string v, out T t) =>
{
int typedValue;
bool result = int.TryParse(v, out typedValue);
t = result ? (T)typedValue : default(T);
//(T)Convert.ChangeType(typedValue, typeof(T)) : default(T);
return result;
};
}
else if (typeof(T) == typeof(uint)) { ... }
else if (typeof(T) == typeof(short)) { ... }
else if (typeof(T) == typeof(ushort)) { ... }
else if (typeof(T) == typeof(long)) { ... }
else if (typeof(T) == typeof(ulong)) { ... }
else if (typeof(T) == typeof(byte)) { ... }
else if (typeof(T) == typeof(sbyte)) { ... }
else if (typeof(T) == typeof(decimal)) { ... }
else if (typeof(T) == typeof(float)) { ... }
else if (typeof(T) == typeof(double)) { ... }
return tryParseDelegate;
}
}
Поэтому мне было интересно, знает ли кто-нибудь, как я могу решить эту проблему (если вы считаете, что выполнение ChangeType() является проблемой) или есть ли лучшее решение, которое я не рассматривал.
Подробнее здесь: https://stackoverflow.com/questions/110 ... f-tryparse
Мобильная версия