【发布时间】:2011-12-29 02:12:10
【问题描述】:
我正在为结构类型编写一个自定义序列化程序,以便与我无法更改的协议进行互操作。我正在使用反射来提取结构成员值并将它们写入BinaryWriter。它仅用于支持它们的基本类型和数组。
if (fi.FieldType.Name == "Int16") bw.Write((Int16)fi.GetValue(obj));
else if (fi.FieldType.Name == "UInt16") bw.Write((UInt16)fi.GetValue(obj));
else if (fi.FieldType.Name == "Int32") bw.Write((Int32)fi.GetValue(obj));
else if (fi.FieldType.Name == "UInt32") bw.Write((UInt32)fi.GetValue(obj));
else if (fi.FieldType.Name == "Int64") bw.Write((Int64)fi.GetValue(obj));
else if (fi.FieldType.Name == "UInt64") bw.Write((UInt64)fi.GetValue(obj));
else if (fi.FieldType.Name == "Single") bw.Write((float)fi.GetValue(obj));
else if (fi.FieldType.Name == "Double") bw.Write((double)fi.GetValue(obj));
else if (fi.FieldType.Name == "Decimal") bw.Write((decimal)fi.GetValue(obj));
else if (fi.FieldType.Name == "Byte") bw.Write((byte)fi.GetValue(obj));
else if (fi.FieldType.Name == "SByte") bw.Write((sbyte)fi.GetValue(obj));
else if (fi.FieldType.Name == "String") bw.Write((string)fi.GetValue(obj));
显然这是丑陋的,当我也想对这些类型的数组做同样的事情时,它变得更加丑陋。
如果我能做这样的事情,那就太好了:
bw.Write( (fi.FieldType) fi.GetValue(obj) );
然后对数组做类似的事情。
有什么想法吗?
【问题讨论】:
-
+1 这个问题,我一直在寻找一种可靠的方法来解决这个问题。
-
如果丑陋的代码最终成为唯一的选择,我通常在这种情况下使用 T4 模板来避免愚蠢的错误,并让 Visual Studio 自动为我生成所有代码。您只需要一个类型列表来迭代或类似的东西。
-
@Jean-BernardPellerin - 不。它需要返回实际类型,就像演员一样。否则编译器无法判断使用
bw.Write的哪个重载。 -
@drdwilcox -
FieldInfo,我从Type.GetFields()获取。
标签: c# .net serialization dynamic casting