Я пишу специальный сериализатор для типов структур для взаимодействия с протоколом, который я не могу изменить. Я использую отражение, чтобы извлечь значения членов структуры и записать их в 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) );
Затем проделайте то же самое для массивов.
Есть идеи?