2012-03-01 2 views
5

Я пытаюсь написать метод для покрытия данного объекта экземпляру заданного типа. Я начал с этим: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)); 
} 

Итак, что мой лучший вариант Если кто-нибудь может дать? я работоспособный подход, я могу взять его оттуда.

+0

ОК, чтобы дать небольшой контекст, немедленное использование этого метода заключается в динамическом назначении свойств экземпляра типа T из значений столбца в объекте DataRow. Я передал бы в словаре , где Key = имя свойства в имени экземпляра и Value = column на DatRow. У меня уже есть отражение, написанное для получения PropertyInfos от типа и установки значений экземпляра. Этот кастинг - мой последний кусочек головоломки. Я бы хотел, чтобы он был как можно более многоразовым, но если ограничивать свой охват моим примером, это упростит, пусть будет так. –

+0

Я знаю, что второй пример выше СЛЕДУЕТ генерировать ошибку компилятора и почему. Спасибо, я просто использую его, чтобы проиллюстрировать этот подход. Не то новое: <) –

ответ

6

Convert.ChangeType должен обрабатывать кромки; он делегирует IConvertible.

Чтобы ответить на вопрос, компилятор не знает, что T is string.
Следовательно, он не позволяет вам выбирать между несвязанными типами (так же, как вы не можете отличить Button - TextBox).

Вы можете работать вокруг этого путь литья в object первый:

return (T)(object)o.ToString(); 

Теперь каждое отдельное преобразование допускается компилятором (это либо прямой вентиляционная или прямой подавленный), и вы знаете, что все предмет будет работать, потому что T есть String.

+0

Почему, черт возьми, я не думаю об этом? Давайте посмотрим, что все говорят, но это вполне приемлемый ответ. –

Смежные вопросы