Динамическое приведение типов неизвестных типов для сериализации

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

Затем проделайте то же самое для массивов.

Есть идеи?

6
задан Polynomial 14 November 2011 в 23:04
поделиться