Я пытаюсь написать метод для покрытия данного объекта экземпляру заданного типа. Я начал с этим:C# Помогите мне с некоторой универсальной отличной отливкой
private static T TryCast<T>(object o)
{
return (T) o;
}
Идя, я знаю, что не будет работать, но она иллюстрирует концепцию. Теперь у меня возникнут проблемы, когда у меня есть типы, которые не будут автоматически выполняться, например string -> DateTime. Я пытался использовать Convert Class для рассмотрения этих случаев, но я просто получаю ошибку времени компиляции вместо ошибки времени выполнения. Следующий код получает ошибку компиляции «не может бросить выражение типа„строки“набрать„T“
private static T TryCast<T>(object o)
{
var typeName = typeof (T).FullName;
switch (typeName)
{
case "System.String":
return (T) Convert.ToString(o);
default:
return (T) o;
}
}
Я также в курсе Convert.ChangeType(), но мне интересно, если он будет обрабатывать края случаи, которые я бы иначе обрабатывать в вышеуказанном переключателе, как заявленной строки -.> DateTime, что я обычно просто использовать Convert.ToDateTime для
private static T TryCast<T>(object o)
{
return (T)Convert.ChangeType(o, typeof(T));
}
Итак, что мой лучший вариант Если кто-нибудь может дать? я работоспособный подход, я могу взять его оттуда.
ОК, чтобы дать небольшой контекст, немедленное использование этого метода заключается в динамическом назначении свойств экземпляра типа T из значений столбца в объекте DataRow. Я передал бы в словаре, где Key = имя свойства в имени экземпляра и Value = column на DatRow. У меня уже есть отражение, написанное для получения PropertyInfos от типа и установки значений экземпляра. Этот кастинг - мой последний кусочек головоломки. Я бы хотел, чтобы он был как можно более многоразовым, но если ограничивать свой охват моим примером, это упростит, пусть будет так. –
Я знаю, что второй пример выше СЛЕДУЕТ генерировать ошибку компилятора и почему. Спасибо, я просто использую его, чтобы проиллюстрировать этот подход. Не то новое: <) –