के लिए अज्ञात प्रकारों की गतिशील कास्टिंग मैं एक प्रोटोकॉल के साथ इंटरऑप के लिए स्ट्रक्चर प्रकारों के लिए कस्टम सीरिएलाइज़र लिख रहा हूं, जिसे मैं बदल नहीं सकता। मैं संरचना सदस्य मूल्यों को खींचने और उन्हें 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, मैं थोड़ी देर के लिए ऐसा करने का एक ठोस तरीका ढूंढ रहा हूं। –
फाई का प्रकार क्या है? – drdwilcox
यदि बदसूरत कोड एकमात्र विकल्प बनता है, तो मैं आम तौर पर बेवकूफ गलतियों से बचने के लिए इस तरह के परिदृश्य के लिए टी 4 टेम्पलेट का उपयोग करता हूं और विजुअल स्टूडियो को स्वचालित रूप से मेरे लिए सभी कोड उत्पन्न करने देता हूं। आपको बस फिर से शुरू करने के लिए प्रकारों की एक सूची की आवश्यकता होगी या ऐसा कुछ। – mellamokb