Я создаю конвертер типов для использования во внутренней библиотеке, которая должна иметь возможность конвертировать из любой тип, возвращаемый базой данных (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());
}