I'm trying to retrieve data from MSNdis_CurrentPacketFilter, my code looks like this:
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;
}
As you can see, I'm casting the received object from NdisCurrentPacketFilter twice, which begs the question: why??
If I try to cast it directly to int, e.g.:
Int32 i32 = (Int32)queryObj["NdisCurrentPacketFilter"];
It throws an InvalidCastException. Why is that?
Three things contribute to this not working for you:
The type of NdisCurrentPacketFilter is uint, according to this link.
Using the indexer queryObj["NdisCurrentPacketFilter"] returns an object, which in this case is a boxed uint, the value of NdisCurrentPacketFilter.
A boxed value type can only be unboxed into the same type, i.e. you must at least use something like:
(int)(uint)queryObj["NdisCurrentPacketFilter"]; (i.e. a single-line version of what you're already doing), or
Convert.ToInt32, which uses IConvertible to perform the cast, unboxing it to uint first.
You can reproduce the same problem as in your question with something like
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With