代码之家  ›  专栏  ›  技术社区  ›  249076

将wmi cimtype转换为system.type

  •  3
  • 249076  · 技术社区  · 15 年前

    我正在尝试编写一个通用扩展来将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。我几乎认为这是一个常见的问题,但我想我正试图用一般的方法来解决它。

    3 回复  |  直到 9 年前
        1
  •  3
  •   sjngm quinti    13 年前

    嗨,您也可以尝试以下代码:

    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);
    }
    }
    
        2
  •  1
  •   DanW    12 年前

    上面的parseExtract对我不起作用,但在我从字符串末尾删除“-000”之后它起作用:

    public static DateTime GetDateTimeValue(this PropertyData pd)
    {
        if (pd.Type == CimType.DateTime)
        {
            string format = "yyyyMMddHHmmss.ffffff";
            string val = pd.Value.ToString().Substring(0,format.Length);
            DateTime ret = DateTime.ParseExact(val, format, System.Globalization.CultureInfo.InvariantCulture);
            return ret;
        }
        throw new ArgumentException();
    }
    
        3
  •  0
  •   249076    15 年前

    这是我最终使用的函数,它是我在链接中发布的函数的修改形式。奇怪的是,没有系统功能来实现这一点。

        /**
        * <summary>
        *   This function converts a WMI CimType to a System.Type
        *   It was copied from: http://www.devcow.com/blogs/adnrg/archive/2005/09/23/108.aspx
        * </summary>
        */
        private static System.Type ConvertCimType(PropertyData property)
        {
            System.Type tReturnVal = null;
    
            switch (property.Type )
            {
                case CimType.Boolean:
                    tReturnVal = typeof(System.Boolean);
                    break;
    
                case CimType.Char16:
                    tReturnVal = typeof(System.String);
                    break;
    
                case CimType.DateTime:
                    tReturnVal = typeof(System.DateTime);
                    break;
    
                case CimType.Object:
                    tReturnVal = typeof(System.Object);
                    break;
    
                case CimType.Real32:
                    tReturnVal = typeof(System.Decimal);
                    break;
    
                case CimType.Real64:
                    tReturnVal = typeof(System.Decimal);
                    break;
    
                case CimType.Reference:
                    tReturnVal = typeof(System.Object);
                    break;
    
                case CimType.SInt16:
                    tReturnVal = typeof(System.Int16);
                    break;
    
                case CimType.SInt32:
                    tReturnVal = typeof(System.Int32);
                    break;
    
                case CimType.SInt8:
                    tReturnVal = typeof(System.SByte);
                    break;
    
                case CimType.String:
                    tReturnVal = typeof(System.String);
                    break;
    
                case CimType.UInt16:
                    tReturnVal = typeof(System.UInt16);
                    break;
    
                case CimType.UInt32:
                    tReturnVal = typeof(System.UInt32);
                    break;
    
                case CimType.UInt64:
                    tReturnVal = typeof(System.UInt64);
                    break;
    
                case CimType.UInt8:
                    tReturnVal = typeof(System.Byte);
                    break;
            }
    
            // do a final check
            tReturnVal = CheckType(property, tReturnVal);
    
            return tReturnVal;
        }
    
    
        private static System.Type CheckType(PropertyData property, System.Type itemType)
        {
            if (property.IsArray)
            {
                return System.Type.GetType( itemType.ToString() + "[]" );
    
            }
            else
            {
                return itemType;
            }
        }