2011-11-23 8 views
7

मुझे लगता है कि मुझे वैलेंटाइजेक्टर और/या ऑटोमैपर के साथ एक साधारण अवधारणा याद आ रही है, लेकिन आप कैसे माता-पिता को गहरी क्लोन करते हैं। ईमानदारी के लिए एंटीटी और सभी बच्चों को शामिल करें?omu.valueinjecter प्रकारों के विपरीत गहरे क्लोन

उदाहरण के लिए, biz.person.InjectFrom(dto.person)। मैं bto.person.AddressList संग्रह को कॉपी करने के लिए dto.person.AddressList संग्रह चाहता हूं, भले ही dto.Address और biz.Address प्रकारों के विपरीत हैं, लेकिन समान संपत्ति नाम हैं।

मेरी सोच यह है कि यदि अभिभावक संपत्ति के नामों की वर्तनी समान होती है, उदा। पता सूची, तो इससे कोई फर्क नहीं पड़ता कि 2 अंतर्निहित वस्तुएं विभिन्न प्रकार के हैं। यह अभी भी पूर्णांक, स्ट्रिंग, आदि की तरह समान नाम वाले सरल प्रकार की नक़ल की

आप

+0

आप ValueInjecter के codeplex पेज से दीप क्लोनिंग पेज पर ध्यान दिया है:

नमूना कोड दीप क्लोनिंग page पर चक नोरिस है करने के लिए कुछ मामूली बदलाव के साथ मैं अपने परीक्षण कोड में काम मिल गया? http://valueinjecter.codeplex.com/wikipage?title=Deep%20Cloning&referringTitle=Home – Omu

+0

हे चक। हाँ, मैंने किया। यह मेरी [निबर्ननेट] बाल संस्थाओं को गहरा क्लोन नहीं किया गया – user52212

+0

यदि आप कुछ कोड पोस्ट करेंगे, और विभिन्न प्रकारों के बारे में, डिफ़ॉल्ट इंजेक्टफ्रॉम() उसी नाम और उसी प्रकार से इंजेक्ट करते हैं तो यह अच्छा होगा, इसलिए यह सदस्यों को प्रभावित नहीं करेगा विभिन्न प्रकार (और यदि आप एक प्रकार से दूसरे में कर रहे हैं जो अब क्लोनिंग नहीं कर रहा है, यही कारण है कि दीपक्लोन ने आपके लिए काम नहीं किया) – Omu

उत्तर

7

मैं एक ही मुद्दा हो रही थी सरणियों/वस्तुओं में सूचियों वही नाम हैं लेकिन विभिन्न प्रकार जब धन्यवाद (यानी एक संपत्ति का नाम जानवरों के प्रकार ORMAnimals [] एक संपत्ति के लिए मैपिंग नाम जानवरों के प्रकार पशु [])।

public class CloneInjection : ConventionInjection 
{ 
    protected override bool Match(ConventionInfo c) 
    { 
     return c.SourceProp.Name == c.TargetProp.Name && c.SourceProp.Value != null; 
    } 

    protected override object SetValue(ConventionInfo c) 
    { 
     //for value types and string just return the value as is 
     if (c.SourceProp.Type.IsValueType || c.SourceProp.Type == typeof(string) 
      || c.TargetProp.Type.IsValueType || c.TargetProp.Type == typeof(string)) 
      return c.SourceProp.Value; 

     //handle arrays 
     if (c.SourceProp.Type.IsArray) 
     { 
      var arr = c.SourceProp.Value as Array; 
      var clone = Activator.CreateInstance(c.TargetProp.Type, arr.Length) as Array; 

      for (int index = 0; index < arr.Length; index++) 
      { 
       var a = arr.GetValue(index); 
       if (a.GetType().IsValueType || a.GetType() == typeof(string)) continue; 
       clone.SetValue(Activator.CreateInstance(c.TargetProp.Type.GetElementType()).InjectFrom<CloneInjection>(a), index); 
      } 
      return clone; 
     } 


     if (c.SourceProp.Type.IsGenericType) 
     { 
      //handle IEnumerable<> also ICollection<> IList<> List<> 
      if (c.SourceProp.Type.GetGenericTypeDefinition().GetInterfaces().Contains(typeof(IEnumerable))) 
      { 
       var t = c.TargetProp.Type.GetGenericArguments()[0]; 
       if (t.IsValueType || t == typeof(string)) return c.SourceProp.Value; 

       var tlist = typeof(List<>).MakeGenericType(t); 
       var list = Activator.CreateInstance(tlist); 

       var addMethod = tlist.GetMethod("Add"); 
       foreach (var o in c.SourceProp.Value as IEnumerable) 
       { 
        var e = Activator.CreateInstance(t).InjectFrom<CloneInjection>(o); 
        addMethod.Invoke(list, new[] { e }); // in 4.0 you can use dynamic and just do list.Add(e); 
       } 
       return list; 
      } 

      //unhandled generic type, you could also return null or throw 
      return c.SourceProp.Value; 
     } 

     //for simple object types create a new instace and apply the clone injection on it 
     return Activator.CreateInstance(c.TargetProp.Type) 
      .InjectFrom<CloneInjection>(c.SourceProp.Value); 
    } 
} 
+0

addMethod.Invoke (सूची, नया [] {ई}); // 4.0 में आप गतिशील और बस सूची का उपयोग कर सकते हैं। जोड़ें (ई); क्या किसी ने ऐसा किया है? मैंने 'var list' को 'गतिशील सूची' के साथ बदलकर और फिर सूची बनाकर कोशिश की है। जोड़ें (ई), जो संकलित करता है लेकिन रनटाइम अपवाद फेंकता है। –

+0

@ ग्लूपी - मैंने कोशिश की लेकिन मुझे स्टैक ओवरफ़्लो मिल रहा था :( – Ryan

+0

@Ryan क्या यह संभव है कि आपके ऑब्जेक्ट्स में से कोई एक संदर्भ है या अन्य माता-पिता ऑब्जेक्ट में बच्चों को घुमाने के दौरान अनंत लूप का कारण बनता है? – Gloopy

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