(int)中的InvalidCastException(targetInstance.GetPropertyValue(“EventCode”));

时间:2012-01-13 12:01:02

标签: c# casting

我正在尝试访问事件代码值(这是一个单位),如下所示:

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 个答案:

答案 0 :(得分:2)

你应该转换为unsigned int,而不是int。

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

编辑转换盒装值(即通过object)需要知道属性的确切类型,包括是否可以为空等等。调用

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

可以让您找到确切的类型。

答案 1 :(得分:1)

假设您正在处理Win32_NTLogEvent类,则需要强制转换为UInt16(或ushort),因为根据{{3},这是“EventCode”的类型}。

(UInt16)(targetInstance.GetPropertyValue("EventCode"))

答案 2 :(得分:0)

尝试

Convert.ToUInt32(targetInstance.GetPropertyValue("EventCode"))

答案 3 :(得分:0)

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类,它有点贵和冗长,但在盒装值可能有几种可能类型的情况下很方便。