我有一个函数来确定记录值的字段大小(以字节为单位)。如果是字符串,我使用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#的新手,所以请随意撕开我的代码。
由于
答案 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)
两种可能的解决方案:
Marshal.SizeOf()方法(http://msdn.microsoft.com/en-us/library/y3ybkfb3.aspx)
sizeof关键字(http://msdn.microsoft.com/en-us/library/eahchzkf%28VS.71%29.aspx)
后者虽然仍然需要一个switch语句,但是不可能这样做:
int x;
sizeof(x);
sizeof仅适用于明确声明的类型,例如的sizeof(int)的
所以(1)在这种情况下是更好的选择(它适用于所有类型,而不仅仅是你的switch语句中的那些类型。)