2009-01-22 14 views
5

मैंने एक वर्ग को एक स्थिर विधि के साथ लिखा है जो संपत्ति वस्तुओं को एक ऑब्जेक्ट से दूसरे ऑब्जेक्ट में कॉपी करता है। यह परवाह नहीं करता कि प्रत्येक वस्तु किस प्रकार है, केवल उनके पास समान गुण हैं। यह वही करता है जो मुझे चाहिए, इसलिए मैं इसे आगे इंजीनियरिंग नहीं कर रहा हूं, लेकिन आप क्या सुधार करेंगे?आप इस उथले प्रतिलिपि कक्षा में कैसे सुधार करेंगे?

public class ShallowCopy 
{ 
    public static void Copy<From, To>(From from, To to) 
     where To : class 
     where From : class 
    { 
     Type toType = to.GetType(); 
     foreach (var propertyInfo in from.GetType().GetProperties(BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance)) 
     { 
      toType.GetProperty(propertyInfo.Name).SetValue(to, propertyInfo.GetValue(from, null), null); 
     } 
    } 
} 

मैं इसे उपयोग कर रहा हूँ इस प्रकार है::

कोड यह

EmployeeDTO dto = GetEmployeeDTO(); 
Employee employee = new Employee(); 
ShallowCopy.Copy(dto, employee); 
+0

हम कैसे एक सूची या किसी वस्तु कई सूची है कि के साथ इस का उपयोग करते हैं इसमें सूचियां? –

+1

यह एक * गहरी * प्रतिलिपि होगी। असल में उपर्युक्त लेकिन रिकर्सिव जैसा ही है जहां आपको 'प्रॉपर्टीइन्फो' ''PropertyType' के साथ मिलता है जो 'IENumerable' से विरासत योग्य है। जाहिर है, लक्ष्य लक्ष्य और चीजों को स्पष्ट करने के साथ आपको सामना करना पड़ेगा। –

उत्तर

6

अपने DTOs serializable हैं? मैं उम्मीद करता हूं, इस मामले में:

MemberInfo[] sm = FormatterServices.GetSerializableMembers(typeof(From)); 
object[] data = FormatterServices.GetObjectData(from, sm); 
FormatterServices.PopulateObjectMembers(to, sm, data); 

लेकिन ध्यान दें कि मैं वास्तव में इस सामान्य दृष्टिकोण से सहमत नहीं हूं। मैं आपके डीटीओ पर प्रतिलिपि बनाने के लिए एक मजबूत अनुबंध पसंद करूंगा जो प्रत्येक डीटीओ लागू करता है।

2

एक नई विधि है कि To का एक नया उदाहरण बनाया है और इससे पहले कि लौटने उपयोगी हो सकता है Copy() विधि कहा जाता है ।

इस तरह:

public static To Create<From, To>(From from) 
    where To : class, new() 
    where From : class 
{ 
    var to = new To(); 
    Copy(from, to); 
    return to; 
} 
1

तय करें कि आप क्या करना चाहते हैं यदि कुछ गुणों को साझा करने वाले प्रकारों को पारित किया जाए लेकिन सभी नहीं। ऑब्जेक्ट में From ऑब्जेक्ट में संपत्ति के अस्तित्व की जांच करें, इसके मान को सेट करने का प्रयास करने से पहले। जब आप ऐसी संपत्ति पर आते हैं जो "अस्तित्व में नहीं है" तो "सही चीज़" करें। यदि सभी सार्वजनिक संपत्तियों को समान होने की आवश्यकता है, तो आपको यह जांचना होगा कि आपने उन सभी को To ऑब्जेक्ट पर सेट किया है और उस मामले को संभालें जहां आपने उचित नहीं है।

मैं यह भी सुझाव दूंगा कि आप उन गुणों को सजाने के लिए विशेषताओं का उपयोग करना चाहेंगे जिन्हें कॉपी करने और दूसरों को अनदेखा करने की आवश्यकता है। यह आपको दो अलग-अलग वस्तुओं के बीच आगे और आगे जाने की अनुमति देगा और आपके व्यावसायिक ऑब्जेक्ट पर संग्रहीत किए गए कुछ सार्वजनिक गुणों को बनाए रखने के लिए जारी रखेगा।

4
  • नामकरण सम्मेलनों का अनुपालन करने के लिए अपने प्रकार पैरामीटर नाम बदलें, उदा। टीएफआरओएम और टीटीओ, या टीएसओआरएस और टीडीएस्ट (या टीडीस्टिनेशन)।

  • अपने अधिकांश काम को सामान्य जेनेरिक विधि के बजाय सामान्य प्रकार में करें। यह आपको गुणों को कैश करने के साथ-साथ प्रकार अनुमान को अनुमति देता है। टाइप करें "TFrom" पैरामीटर पर अनुमान महत्वपूर्ण है, क्योंकि यह अनाम प्रकारों का उपयोग करने की अनुमति देगा।

  • आप संभावित रूप से संपत्ति को प्रतिलिपि बनाने और उसे "प्रतिनिधि" प्रकार के लिए मान्य एक प्रतिनिधि में रखने के लिए गतिशील रूप से कोड उत्पन्न करके इसे तेजी से तेज़ कर सकते हैं। या संभावित रूप से प्रत्येक से/जोड़ी के लिए इसे उत्पन्न करें, जिसका अर्थ यह होगा कि वास्तविक प्रतिलिपि को प्रतिबिंब का उपयोग करने की आवश्यकता नहीं होगी! (कोड तैयार कर रहा है एक बार की प्रकार के प्रति जोड़ी हिट होगा, लेकिन उम्मीद है कि आप भी कई जोड़े नहीं होती।)

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