使用Reflection从PropertyType获取字节数

时间:2013-10-03 13:13:21

标签: c#

我有一个函数来确定记录值的字段大小(以字节为单位)。如果是字符串,我使用Length来返回数字字节。如果它不是字符串,我调用另一个使用开关分配字节数的方法。

这就是我所拥有的:

private int getRecordFieldSize(PropertyInfo recordField,DataRecord dataRecord)
{

     if (recordField.PropertyType.ToString() == "System.String")
     {
          return recordField.GetValue(dataRecord,null).ToString().Length;
     }
     else
     {
           int bytesOfPropertyType = getBytesBasedOnPropertyType(recordField.PropertyType.ToString());
           return bytesOfPropertyType;
     }
}
private int GetBytesBasedOnPropertyType(string propType)
{

    switch(propType)
    {
        case "System.Boolean":
            return 1;
        case "System.Byte":
            return 1;
        case "System.SByte":
            return 1;
        case "System.Char":
            return 1;
        case "System.Decimal":
            return 16;
        case "System.Double":
            return 8;
        case "System.Single":
            return 4;
        case "System.Int32":
            return 4;
        case "System.UInt32 ":
            return 4;
        case "System.Int64":
            return 8;
        case "System.UInt64":
            return 8;
        case "System.Int16":
            return 2;
        case "System.UInt16":
            return 2;
        default:
            Console.WriteLine("\nERROR: Unhandled type in GetBytesBasedOnPropertyType." +
                        "\n\t-->String causing error: {0}", propType);
            return -1;
    }

}

我的问题:有没有办法可以避免使用switch语句来分配字节?

我觉得应该有一些方法可以使用Reflection获取字节数但我在MSDN上找不到任何内容。

我是C#的新手,所以请随意撕开我的代码。

由于

2 个答案:

答案 0 :(得分:3)

这可能会有所帮助

private int getRecordFieldSize(PropertyInfo recordField,DataRecord dataRecord)
{

 if (recordField.PropertyType.ToString() == "System.String")
 {
      return recordField.GetValue(dataRecord,null).ToString().Length;
 }
 else
 {
       int bytesOfPropertyType = System.Runtime.InteropServices.Marshal.SizeOf(recordField.PropertyType);
       return bytesOfPropertyType;
 }

}

答案 1 :(得分:2)

两种可能的解决方案:

  1. Marshal.SizeOf()方法(http://msdn.microsoft.com/en-us/library/y3ybkfb3.aspx

  2. sizeof关键字(http://msdn.microsoft.com/en-us/library/eahchzkf%28VS.71%29.aspx

  3. 后者虽然仍然需要一个switch语句,但是不可能这样做:

    int x;
    sizeof(x);
    

    sizeof仅适用于明确声明的类型,例如的sizeof(int)的

    所以(1)在这种情况下是更好的选择(它适用于所有类型,而不仅仅是你的switch语句中的那些类型。)