2010-01-14 14 views
7

मैंएक वर्ग को दूसरे में कॉपी करें?

class A 
{ 
    public int a; 
    public string b; 
} 

मैं एक एक और एक को कॉपी कर सकते हैं है? सी ++ में मुझे पता है कि मैं *a1 = *a2; कर सकता हूं। क्या सी # में कुछ समान है? मुझे पता है कि मैं प्रतिबिंब का उपयोग कर एक सामान्य समाधान लिख सकता हूं लेकिन मुझे उम्मीद है कि कुछ पहले से मौजूद है।

मैं ए को एक नालीदार संरचना में बदलने पर विचार कर रहा हूं।

चरण 2 मैं

class B : A {} 
class C : A {} 

करने की ज़रूरत है और बी से सी के लिए आधार डेटा कॉपी कर देंगे

+1

क्यों आप की जरूरत है यह करो? –

+0

आपने पहले ही यह पूछा है: http://stackoverflow.com/questions/2067725/best-way-to-convert-a-shared-base – Amy

+0

@ yodaj007: यह उस प्रश्न से अपने विचार को साफ करता है। मैंने पहले से ही पुराने को बंद करने के लिए वोट दिया है। –

उत्तर

6

यहाँ, कुछ सरल कोड है कि किसी भी वर्ग पर काम करता है बस नहीं आधार।

public static void DuckCopyShallow(this Object dst, object src) 
    { 
     var srcT = src.GetType(); 
     var dstT= dst.GetType(); 
     foreach(var f in srcT.GetFields()) 
     { 
      var dstF = dstT.GetField(f.Name); 
      if (dstF == null) 
       continue; 
      dstF.SetValue(dst, f.GetValue(src)); 
     } 

     foreach (var f in srcT.GetProperties()) 
     { 
      var dstF = dstT.GetProperty(f.Name); 
      if (dstF == null) 
       continue; 

      dstF.SetValue(dst, f.GetValue(src, null), null); 
     } 
    } 
4

मान लिया जाये कि एक बस एक साधारण वर्ग है, तो आप क्या कर सकते हैं

A newA = instanceOfA.MemberwiseClone(); 

सदस्यwiseक्लोन() हालांकि एक उथली प्रतिलिपि है, इसलिए यदि आपकी कक्षा जटिल हो जाती है, तो गुणों के साथ संदर्भ प्रकार भी हैं, यह आपके लिए काम नहीं करेगा।

+0

हालांकि यह एक गैर-प्रतिबिंब दृष्टिकोण के रूप में तेज़ नहीं हो सकता है। –

+0

सहमत हुए। हालांकि यह एक कस्टम दृष्टिकोण से अधिक सुविधाजनक और स्केलेबल हो सकता है। – womp

0

आप क्लोन कर सकते हैं, तो आप एक प्रति निर्माता परिभाषित कर सकते हैं। क्लास को स्ट्रक्चर में क्यों बदलें क्योंकि सी ++ में आप 10 अक्षरों में कुछ कर सकते हैं। सी # अलग है। संरचनाओं के फायदे और नुकसान होते हैं।

3

उचित कंस्ट्रक्टर्स जोड़ें:

class Foo 
{ 
    public Foo(int a, string b) 
    { 
     A = a; 
     B = b; 
    } 

    public Foo(Foo other) 
    { 
     A = other.A; 
     B = other.B; 
    } 

    public int A { get; set; } 
    public string B { get; set; } 
} 

आप भी इसे अपरिवर्तनीय बनाने पर विचार करना चाहिए, खासकर यदि आप एक struct में बनाने पर विचार कर रहे हैं। उत्परिवर्तनीय structs बुराई हैं।

अंत में जब आप कक्षा से विरासत में होते हैं तो आपको सदस्यों को बेस क्लास से उप-वर्ग में कॉपी करने की आवश्यकता नहीं होती है।

+0

+1 अगर मेरे पास आज पर्याप्त वोट थे। अपरिवर्तनीय कोई निर्धारित गुण नहीं होगा, है ना? –

+0

@lpthnc: 'निजी सेट 'यह करेगा। –

+0

धन्यवाद। आप कैसे घोषणा करेंगे कि यदि आप सार्वजनिक रूप से रखना चाहते हैं - एक ही पंक्ति या अलग से? –

7

मैंने बाइनरी क्रमबद्धता का उपयोग किया है। असल में, उदाहरण को स्मृति स्ट्रीम में क्रमबद्ध करें। फिर, इसे स्मृति धारा से बाहर deserialize। आपके पास एक सटीक बाइनरी प्रति होगी। यह एक उथली प्रतिलिपि की बजाय एक गहरी प्रति होगी।

class a = new ClassA(); 

class b = MySerializationMethod(a); 

एक उथले प्रतिलिपि के लिए आप उपयोग कर सकते हैं Object.MemberwiseClone

+0

+1। हमने इसे कई बार इस्तेमाल किया है और यह बहुत अच्छा काम करता है। – womp

+0

यह ऑब्जेक्ट की तरह दिखता है। MemberwiseClone केवल दो वर्गों के साथ काम करता है और कक्षा विधि के भीतर ही होता है? मैं MySerializationMethod प्रोग्राम कैसे कर सकता हूं? ऐसा लगता है कि मैं प्रतिबिंब का उपयोग करूँगा। –

+0

किसी ने इसे नीचे पोस्ट किया: http://www.c-sharpcorner.com/UploadFile/sd_surajit/cloning05032007012620AM/cloning.aspx कोई प्रतिबिंब आवश्यक नहीं है –

2

हम इस कोड को सफलतापूर्वक उपयोग किया है:

using System; 
using System.IO; 
using System.Runtime.Serialization.Formatters.Binary; 

namespace Utility { 
    internal static class ObjectCloner { 
     public static T Clone<T>(T obj) { 
      using (MemoryStream buffer = new MemoryStream()) { 
       BinaryFormatter formatter = new BinaryFormatter(); 
       formatter.Serialize(buffer, obj); 
       buffer.Position = 0; 
       T temp = (T)formatter.Deserialize(buffer); 
       return temp; 
      } 
     } 
    } 
} 

अन्य तरीकों जो बेहतर काम हो सकता है, लेकिन शायद यह तुम्हारी मदद करेगा

क्रिस

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