我正在編寫一個自定義序列化程序的結構類型與協議我不能改變互操作。我使用反射來提取結構成員值並將它們寫入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