2010-11-10 8 views
7

मैंने एक ऐसा फ़ंक्शन लिखा है जो एक वर्ग के गुणों को प्रतिलिपि बनाता है ताकि किसी ऑब्जेक्ट की प्रतिलिपि बना सके।.NET: क्या एक कक्षा के गुणों को प्रतिलिपि बनाने के लिए एक कक्षा है

तो

MyObject myObject = myOtherObject.MyCustomCopy(myObject) 

जहां myObject और myOtherObject एक ही प्रकार के कर रहे हैं की तरह कुछ। मैं bascually

myObject.prop1 = myOtherObject.prop1 
myObject.prop2 = myOtherObject.prop2 
myObject.prop3 = myOtherObject.prop3 
return myObject 

करके यह कर रहा, सुंदर अतीत मैं एक .NET ऑब्जेक्ट कि automaticaly ऐसा किया इस्तेमाल किया में यकीन प्रतिबिंब मुझे लगता है कि द्वारा, लेकिन यह याद नहीं कर सकते ... या एक मैं कल्पना है कि ऐसी विधि मौजूद है?

हाँ मुझे ऑटो मैपर से अवगत है, लेकिन मुझे यकीन था (अब इतना नहीं) कि एक .NET ऑब्जेक्ट है जो नौकरी करता है। शायद नहीं! इस लिंक में

उत्तर

9

आप AutoMapper पर एक नज़र लग सकता है।

+0

इस के लिए टाइमस्टैम्प की जांच करनी थी :) –

5

आपको AutoMapper का उपयोग करना चाहिए, यह इस काम के लिए बनाया गया था।

+0

प्रश्न यह है कि किसी ऑब्जेक्ट की प्रतिलिपि कैसे बनाएं, किसी ऑब्जेक्ट के प्रॉपर्टी वैल्यू को किसी भिन्न प्रकार ऑब्जेक्ट में कॉपी न करें। – Sisyphus

+0

आप इस तरह से वस्तुओं को क्लोन कर सकते हैं। –

2
+0

हाय बिटबोनक, जो वास्तव में संदर्भ प्रकारों की प्रतिलिपि नहीं करता है, यह सिर्फ संदर्भ – Bob

+0

प्रतिलिपि बनाता है हां यह एक उथली प्रतिलिपि करता है। – bitbonk

1

इस कोड को यकीन नहीं है कि यह कैसे कुछ भी जटिल (सूचियों, सरणियों, कस्टम वर्ग) के लिए जाना होगा बुनियादी संपत्ति प्रकार के लिए काम करना चाहिए,।

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

private void button1_Click(object sender, EventArgs e) 
{ 
    MyClass orig = new MyClass() { A = 1, B = "hello" }; 
    MyClass copy = new MyClass(); 

    PropertyInfo[] infos = typeof(MyClass).GetProperties(); 
    foreach (PropertyInfo info in infos) 
    { 
    info.SetValue(copy, info.GetValue(orig, null), null); 
    } 
    Console.WriteLine(copy.A + ", " + copy.B); 
} 
4
public static class ext 
{ 
    public static void CopyAllTo<T>(this T source, T target) 
    { 
     var type = typeof(T); 
     foreach (var sourceProperty in type.GetProperties()) 
     { 
      var targetProperty = type.GetProperty(sourceProperty.Name); 
      targetProperty.SetValue(target, sourceProperty.GetValue(source, null), null); 
     } 
     foreach (var sourceField in type.GetFields()) 
     { 
      var targetField = type.GetField(sourceField.Name); 
      targetField.SetValue(target, sourceField.GetValue(source)); 
     } 
    } 
} 
+0

उपरोक्त वर्णित ऑटोमैपर अधिक शक्तिशाली है, लेकिन मेरे जैसे साधारण उपयोग मामलों के लिए, यह चलने के लिए बहुत आसान और तेज़ है। धन्यवाद! –

0

बहुत सरल शब्दों में: एक प्रारंभिक बिंदु हालांकि होना चाहिए हम कक्षा जानते हैं सी # नेट यानी संदर्भ प्रकार जब हम एक वर्ग के एक वस्तु बनाने के रूप में इस तरह के

Customer C1=new Customer(); 
C1.Id=1; 
C1.Name="Rakesh"; 
के रूप में

फिर सी 1 (रेफरेंस वेरिएबल) मेमोरी स्टैक पर संग्रहीत है और ऑब्जेक्ट नया ग्राहक() हीप पर संग्रहीत है।

इसलिए जब हम किसी अन्य वर्ग जो मूल रूप से अपने प्रश्न आप नीचे दिए गए की तरह कुछ कर सकते हैं में एक वर्ग कॉपी:

Customer C2=C1; 

ऊपर कर सी 2 में सी 1 संदर्भ चर की प्रतिलिपि बनाएगा लेकिन कारण है कि मैं ढेर और ढेर के बारे में लिखा सी 2 संदर्भ चर का उपयोग कर, क्योंकि आप दोनों C1 और C2 HEAP.Something की तरह में एक ही वस्तु की ओर इशारा करते

C2.Id=1; 
C2.Name="Mukesh"; 

अब अगर आप पहुँच C1.Name करने की कोशिश करेंगे तो आप इसे करने के लिए "मुकेश" बदल गया है देखेंगे जा रहा वस्तु गुण बदल सकते हैं ।

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