2011-10-14 12 views
5

मैं बिना किसी संदर्भ के क्लास ऑब्जेक्ट की प्रति कैसे बना सकता हूं? ICloneable एक क्लास ऑब्जेक्ट की प्रतिलिपि बनाता है (उथले प्रतिलिपि के माध्यम से) लेकिन गहरी प्रतिलिपि का समर्थन नहीं करता है। मैं ऐसे फ़ंक्शन की तलाश में हूं जो क्लास ऑब्जेक्ट के सभी सदस्यों को पढ़ने के लिए पर्याप्त स्मार्ट है और सदस्य नाम निर्दिष्ट किए बिना किसी अन्य ऑब्जेक्ट में गहरी प्रतिलिपि बनाते हैं।बिना किसी संदर्भ के क्लास ऑब्जेक्ट की प्रति कैसे बनाएं?

+2

संभव डुप्लिकेट (http://stackoverflow.com/questions/2417023/clone-whole-object-graph) – xanatos

+1

त्वरित और गंदे समाधान वस्तु को क्रमबद्ध करना और तुरंत किसी अन्य वस्तु को deserialize है। बेशक यह इस बात पर निर्भर करता है कि ऑब्जेक्ट को सही ढंग से क्रमबद्ध किया जा सकता है ... – canon

उत्तर

4

मैं एक समाधान के रूप में यह देखा है, मूल रूप से के बाद से आप के बारे में ICloneable एक गहरी प्रतिलिपि

public static T DeepCopy(T other) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     BinaryFormatter formatter = new BinaryFormatter(); 
     formatter.Serialize(ms, other); 
     ms.Position = 0; 
     return (T)formatter.Deserialize(ms); 
    } 
} 

मैं इस सूत्र को संदर्भित कर रहा हूँ नहीं कर क्या कहा यह करने के लिए अपने स्वयं के समारोह में लिखें। copy a class, C#

0
public static object Clone(object obj) 
    { 
     object new_obj = Activator.CreateInstance(obj.GetType()); 
     foreach (PropertyInfo pi in obj.GetType().GetProperties()) 
     { 
      if (pi.CanRead && pi.CanWrite && pi.PropertyType.IsSerializable) 
      { 
       pi.SetValue(new_obj, pi.GetValue(obj, null), null); 
      } 
     } 
     return new_obj; 
    } 

आप अपनी आवश्यकताओं को समायोजित कर सकते हैं। उदाहरण के लिए,

if (pi.CanRead && pi.CanWrite && 
     (pi.PropertyType == typeof(string) || 
     pi.PropertyType == typeof(int) || 
     pi.PropertyType == typeof(bool)) 
    ) 
{ 
    pi.SetValue(new_obj, pi.GetValue(obj, null), null); 
} 

या

if (pi.CanRead && pi.CanWrite && 
    (pi.PropertyType.IsEnum || pi.PropertyType.IsArray)) 
{ 
    ...; 
} 
[क्लोन पूरी वस्तु ग्राफ़] की
+0

क्या यह किसी भी तरह से रिकर्सिव तरीके से है जिसे मैं स्पष्ट रूप से नहीं देख सकता हूं? –

संबंधित मुद्दे