InvalidCastException in (int) (targetInstance.GetPropertyValue ("EventCode")); - PullRequest
1 голос
/ 13 января 2012

Я пытаюсь получить доступ к значению кода события (которое является единицей) следующим образом:

private static void EventLogMonitor(object sender, EventArrivedEventArgs e)
{
  ManagementBaseObject targetInstance = (ManagementBaseObject)e.NewEvent.GetPropertyValue("TargetInstance");
  EventId = (int)(targetInstance.GetPropertyValue("EventCode"));
  ...

Но я получаю недопустимое исключение приведения на (int)(targetInstance.GetPropertyValue("EventCode")).Кажется, этот кусок кода возвращает объект, интересно, как можно получить доступ к значению кода события uint?

Ответы [ 4 ]

2 голосов
/ 13 января 2012

Вы должны приводить к unsigned int, а не к int.

(uint)(targetInstance.GetPropertyValue("EventCode"))

EDIT Приведение значений в штучной упаковке (т.е. через object) требует знания точного типа свойствав том числе обнуляемый или нет, и т. д. Вызов

targetInstance.GetPropertyValue("EventCode").GetType().FullNa‌​me

позволяет узнать точный тип.

1 голос
/ 13 января 2012

Предполагая, что вы имеете дело с Win32_NTLogEvent классами, вам необходимо привести к UInt16 (или ushort), так как это тип для "EventCode" в соответствии с msdn .

(UInt16)(targetInstance.GetPropertyValue("EventCode"))
0 голосов
/ 13 января 2012

targetInstance.GetPropertyValue("EventCode") возвращает в штучной упаковке ushort.

Существует действительный показаний для превращения в штучной упаковке ushort в ushort:

ushort usVal = (ushort)boxUS;

Есть действительное явноеприведение для превращения ushort в int:

int iVal = (int)ushortVal;

Существует также допустимое неявное приведение для превращения ushort в int:

int iVal = uShortVal;

Ноне существует действительного неявного или явного приведения для преобразования ushort в штучной упаковке в int:

int iVal = (int)boxUS; // throws exception.

Но мы можем объединить вышеперечисленное:

int iVal = (int)(ushort)boxUS;
int iVal2 = (ushort)boxUS;

Следовательно:

EventID = (ushort)targetInstance.GetPropertyValue("EventCode"); //works
EventID = (int)(ushort)targetInstance.GetPropertyValue("EventCode"); //works and arguably clearer.

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

0 голосов
/ 13 января 2012

Попробуйте

Convert.ToUInt32(targetInstance.GetPropertyValue("EventCode"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...