Как правильно преобразовать строку в неизвестный числовой тип? - PullRequest
0 голосов
/ 22 мая 2009

Я создаю конвертер типов для использования во внутренней библиотеке, которая должна иметь возможность конвертировать из любой тип, возвращаемый базой данных (long, DBNull, bool, string и т. Д.) к любому совместимому типу.

Все это работает плавно и плавно для предметов, которые можно кастовать:

try { return (T)value } catch(InvalidCaseException) { }

Или можно разобрать:

см. Преобразовать в Nullable из строки, используя Reflection

Однако я бью кирпичную стену, когда хочу этого желаемого поведения:

Assert.That(
    2,
Is.EqualTo(
    Converter<long>.Convert("2.1")
));

Проблема в том, что функции Pasre и TryParse отбрасывают это обратно как недопустимый формат, когда реальным желаемым результатом является усечение десятичного числа.

Как вы думаете, что будет лучшим способом для анализа строки типа "2.1" в неизвестный тип значения , используя отражение ?

РЕДАКТИРОВАТЬ: В настоящее время я использую:

if (Nullable.GetUnderlyingType(t) != null)
{
    t = Nullable.GetUnderlyingType(t);
}

MethodInfo parse = t.GetMethod("Parse", new Type[] { typeof(string) });

if (parse != null)
{
    object parsed = parse.Invoke(null, new object[] { value.ToString() });
    return (T)parsed;
}
else
{
    throw new InvalidOperationException("The value you specified is not a valid " + typeof(T).ToString());
}

1 Ответ

4 голосов
/ 22 мая 2009

Какая версия .NET и какой диапазон значений? Например, можно было бы проанализировать его как десятичное и преобразовать его оттуда ...

T val = Convert.ChangeType(decimal.Parse("2.1"), typeof(T))

(выше только показывает центральное преобразование - оно не пытается вписать его в существующий код)

Это не будет работать для огромных / очень маленьких значений, но, вероятно, не будет страдать от тех же проблем округления, что и double.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...