Как я могу преобразовать в определенный тип в общей версии TryParse()?C#

Место общения программистов C#
Ответить
Anonymous
 Как я могу преобразовать в определенный тип в общей версии TryParse()?

Сообщение Anonymous »

У меня есть следующий сценарий, в котором я хочу передать строку и общий тип:

Код: Выделить всё

public class Worker {
public void DoSomeWork(string value)
where T : struct, IComparable, IEquatable { ... }
}
В какой-то момент мне нужно преобразовать строковое значение в его значение T. Но я не хочу выполнять прямое преобразование, так как мне нужно выполнить некоторую логику, если строку невозможно преобразовать в тип T.

Я подумал, что мог бы попробовать использовать 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;
}
}
Но в приведенном выше примере есть проблема: я не могу написать t = result ? (T)typedValue : default(T);, поскольку приведение typedValue к T вызывает проблемы, и единственный способ обойти это до сих пор - написать (T )Convert.ChangeType(typedValue, typeof(T)). Но если я сделаю это, я просто совершу еще одно обращение.

Поэтому мне было интересно, знает ли кто-нибудь, как я могу решить эту проблему (если вы считаете, что выполнение ChangeType() является проблемой) или есть ли лучшее решение, которое я не рассматривал.

Подробнее здесь: https://stackoverflow.com/questions/110 ... f-tryparse
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»