我正在尝试编写一个通用扩展,以将ManagementObjectCollection转换为DataTable。这只是为了简化我正在编写的启动脚本/程序。我遇到了CimType问题。我已经包括了我到目前为止编写的代码。
public static DataTable GetData(this ManagementObjectCollection objectCollection)
{
DataTable table = new DataTable();
foreach (ManagementObject obj in objectCollection)
{
if (table.Columns.Count == 0)
{
foreach (PropertyData property in obj.Properties)
{
table.Columns.Add(property.Name, property.Type);
}
}
DataRow row = table.NewRow();
foreach (PropertyData property in obj.Properties)
{
row[property.Name] = property.Value;
}
table.Rows.Add(row);
}
return table;
}
}
我发现了一种我认为可以在http://www.devcow.com/blogs/adnrg/archive/2005/09/23/108.aspx上使用的方法。但是在我看来,似乎有更好的方法,甚至是我忽略的.net函数。
我想我没有说清楚。我遇到的问题是我需要从System.Management.CimType转换为System.Type。我几乎以为这是一个普遍的问题,但是我想我想以一种普遍的方式解决它。
最佳答案
嗨,您也可以尝试以下代码:
public static class CimConvert
{
private readonly static IDictionary<CimType, Type> Cim2TypeTable =
new Dictionary<CimType, Type>
{
{CimType.Boolean, typeof (bool)},
{CimType.Char16, typeof (string)},
{CimType.DateTime, typeof (DateTime)},
{CimType.Object, typeof (object)},
{CimType.Real32, typeof (decimal)},
{CimType.Real64, typeof (decimal)},
{CimType.Reference, typeof (object)},
{CimType.SInt16, typeof (short)},
{CimType.SInt32, typeof (int)},
{CimType.SInt8, typeof (sbyte)},
{CimType.String, typeof (string)},
{CimType.UInt8, typeof (byte)},
{CimType.UInt16, typeof (ushort)},
{CimType.UInt32, typeof (uint)},
{CimType.UInt64, typeof (ulong)}
};
public static Type Cim2SystemType(this PropertyData data)
{
Type type = Cim2TypeTable[data.Type];
if (data.IsArray)
type = type.MakeArrayType();
return type;
}
public static object Cim2SystemValue(this PropertyData data)
{
Type type = Cim2SystemType(data);
if (data.Type == CimType.DateTime)
return DateTime.ParseExact(data.Value.ToString(), "yyyyMMddHHmmss.ffffff-000", CultureInfo.InvariantCulture);
return Convert.ChangeType(data.Value, type);
}
}
关于c# - 将WMI CimType转换为System.Type,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2905560/