2013-11-09 3 views
3

У меня возникла проблема. Отбрасывание с объекта на короткий не работает.Невозможный литой от объекта до короткого

В классе у меня есть, что (Juste в Exemple):

public const uint message_ID = 110; 

И в другом классе, в конструкторе, у меня есть что:

Assembly asm = Assembly.GetAssembly(typeof(ProtocolTypeManager)); 

foreach (Type type in asm.GetTypes()) 
{ 
     if (type.Namespace == null || !type.Namespace.StartsWith(typeof(MyClass).Namespace)) 
       continue; 

     FieldInfo field = type.GetField("message_ID"); 

     if (field != null) 
     { 
      short id = (short)(field.GetValue(type)); 
      ... 
     } 
} 

У меня нет никаких проблем с недо гипсе , Мое поле не равно null и field.GetValue (тип) дает мне хороший объект (значение объекта = 110).

Где-то я читал, что распаковка из объекта в целое работу, ну, я попробовал, но он по-прежнему не работает:

object id_object = field.GetValue(type); 
int id_int = (int)id_object; 
short id = (short)id_object; 

Исключение это один: http://puu.sh/5d2jR.png (простите за французский . Это говорит о том, что это ошибка типа или броска).

Есть ли у кого есть решение?

Спасибо, Veriditas.

ответ

5

Вам нужно распаковывать его uint (оригинальный тип message_ID):

object id_object = field.GetValue(type); 
uint id_uint = (uint)id_object; 
short id = (short)id_uint; 

Здесь вы можете найти очень хорошо читать об этой теме: Representation and Identity

+0

Хорошо, я просто попробовал. Первый актерский состав, от объекта к uint, второй - нет. И, исправляя, я понимаю ту тупость, которую я совершил. Эта работа: объект id_object = field.GetValue (тип); uint id_uint = (uint) id_object; short id = (short) id_uint; Второй литой концерн id_uint и не id_object ... Большое вам спасибо Alberto :) – Veriditas

+2

Второе приведение должно быть «short id = (short) id_uint;» Вы также можете сократить это до «short id = (short) (uint) id_object; ' –

+1

Эффективно Рори, это короче. Спасибо ! – Veriditas

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