我正在尝试访问事件代码值(这是一个单位),如下所示:
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事件代码值?
答案 0 :(得分:2)
你应该转换为unsigned int,而不是int。
(uint)(targetInstance.GetPropertyValue("EventCode"))
编辑转换盒装值(即通过object
)需要知道属性的确切类型,包括是否可以为空等等。调用
targetInstance.GetPropertyValue("EventCode").GetType().FullName
可以让您找到确切的类型。
答案 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
类,它有点贵和冗长,但在盒装值可能有几种可能类型的情况下很方便。