我正在尝试从 MSNdis_CurrentPacketFilter 检索数据,我的代码如下所示:

ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\WMI",
                "SELECT NdisCurrentPacketFilter FROM MSNdis_CurrentPacketFilter");

foreach (ManagementObject queryObj in searcher.Get())
{
     uint obj = (uint)queryObj["NdisCurrentPacketFilter"];
     Int32 i32 = (Int32)obj;
}

如您所见,我将从 NdisCurrentPacketFilter 接收到的对象转换两次 ,这就引出了一个问题: 为什么是 ??

如果我尝试将其直接转换为 int ,例如:
Int32 i32 = (Int32)queryObj["NdisCurrentPacketFilter"];

它抛出一个 InvalidCastException 。这是为什么?

最佳答案

三件事导致这对您不起作用:

  • 根据 this linkNdisCurrentPacketFilter 的类型是 uint
  • 使用索引器 queryObj["NdisCurrentPacketFilter"] returnsobject ,在本例中是 boxed uint ,即 NdisCurrentPacketFilter 的值。
  • 一个装箱的值类型 can only 被拆箱成相同的类型,即你 必须至少使用类似的东西:
  • (int)(uint)queryObj["NdisCurrentPacketFilter"];(即你已经在做的单行版本),或
  • Convert.ToInt32 ,它使用 IConvertible 执行转换,首先将其拆箱为 uint


  • 您可以使用类似的方法重现与您的问题相同的问题
    object obj = (uint)12345;
    uint unboxedToUint = (uint)obj; // this is fine as we're unboxing to the same type
    int unboxedToInt = (int)obj; // this is not fine since the type of the boxed reference type doesn't match the type you're trying to unbox it into
    int convertedToInt = Convert.ToInt32(obj); // this is fine
    

    关于c# - 将 uint 转换为 Int32,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28928393/

    10-14 08:58