私は変更できないプロトコルを持つinterop用の構造体型用のカスタムシリアライザを作成しています。私はリフレクションを使用して構造体メンバの値を取り出し、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この質問に対して、私はしばらくの間これを行うための堅実な方法を探してきました。 –
fiの種類は何ですか? – drdwilcox
醜いコードが唯一の選択肢になってしまった場合、私は一般的に、この種のシナリオではT4テンプレートを使用して、愚かな間違いを避け、Visual Studioに自動的にすべてのコードを生成させます。あなたは、繰り返し処理するための型のリストが必要です。 – mellamokb