Estoy escribiendo un serializador personalizado para los tipos de estructura para la interoperabilidad con un protocolo que no puedo modificar. Estoy usando el reflejo para extraer los valores de los miembros de la estructura y escribirlos en un BinaryWriter
. Está diseñado solo para admitir tipos básicos y matrices de ellos.Fundición dinámica de tipos desconocidos para serialización
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));
Obviamente, esto es feo, y se pone aún más fea cuando quiero hacer lo mismo con las matrices de este tipo también.
Lo que sería realmente agradable es si podría hacer algo como esto:
bw.Write((fi.FieldType) fi.GetValue(obj));
Después, realice el mismo tipo de cosas para las matrices.
¿Alguna idea?
+1 para esta pregunta, he estado buscando una forma sólida de hacer esto por bastante tiempo. –
¿Cuál es el tipo de fi? – drdwilcox
Si el código feo termina siendo la única opción, generalmente uso plantillas T4 para este tipo de escenario para evitar errores estúpidos y dejar que Visual Studio genere todo el código automáticamente. Solo necesitarías una lista de tipos para iterar o algo así. – mellamokb