2011-01-14 17 views
8

तो मेरे पास है इस तरह दो कस्टम जटिल प्रकार के (इस उदाहरण के लिए oversimplified):एक और कस्टम जटिल प्रकार के लिए एक कस्टम जटिल प्रकार परिवर्तित करने के लिए कैसे

public class PendingProduct 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public int ColorCount { get; set; } 
} 

चलो कहते हैं कि मैं इस वस्तु की जरूरत है पता है कि कैसे खुद को परिवर्तित करने के लिए करते हैं अन्य प्रकार के:

public class Product 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public ProductColors Colors { get; set;} 
} 

तो जब मैं एक विधि उत्पाद को PendingProduct कन्वर्ट करने के लिए कहते हैं, मुझे लगता है कि कहते हैं ProductColor की "ColorCount" संख्या उत्पाद वर्ग के लिए वस्तुओं कुछ कस्टम तर्क पर अमल करेंगे। यह पूरी तरह से अतिसंवेदनशील है, लेकिन कक्षा का वास्तुकला वास्तव में यहां अप्रासंगिक है।

क्या मेरा मुख्य सवाल यह है कि, यह है:

क्या एक और जटिल प्रकार के लिए एक जटिल प्रकार के रूपांतरण को लागू करने के लिए जब वस्तुओं के गुण अलग उपयोग करने के लिए सबसे अच्छा अभ्यास विधि है?

असली दुनिया में, गुण बहुत अलग हैं और मैं मैप करने के लिए कि मैं क्या बी

वस्तु को

जाहिर है मैं सिर्फ एक समारोह जो एक इनपुट पैरामीटर लेता है लिख सकता है वस्तु एक से जरूरत कुछ कस्टम तर्क लिख दिया जाएगा ऑब्जेक्ट ए का ऑब्जेक्ट बी देता है, लेकिन मैं एक और "बेस्ट प्रैक्टिस" विधि की तलाश में हूं। क्या IConvertible यहाँ खेलने में आते हैं? क्या ओओपी की तरह कुछ और है कि मैं सिर्फ वही काम करने के बजाय एक समारोह लिखने का फायदा उठा सकता हूं जो मैं चाहता हूं?

वस्तु एक हमेशा कैसे वस्तु को बी

संपादित करें खुद कन्वर्ट करने के लिए पता होना चाहिए: एक पक्ष नोट के रूप में, असली दुनिया में, वस्तु एक और वस्तु बी दोनों इकाई की रूपरेखा 4 संस्थाओं कर रहे हैं। मैं एक "लंबित उत्पाद" लेना चाहता हूं, इसे एक नई उत्पाद इकाई में परिवर्तित करना चाहता हूं, इसे डेटा संदर्भ में संलग्न करें और सहेजें।

उत्तर

18

ऐसा करने के कई तरीके हैं, लेकिन वे वास्तव में मैपिंग कोड लिखने, प्रतिबिंब के माध्यम से इसे संभालने, या AutoMapper जैसे पूर्व-निर्मित ढांचे पर भरोसा करने के लिए उबालते हैं। मैंने एक अन्य प्रश्न here में एक समान प्रश्न का उत्तर दिया है।

मैं इसे यहाँ आपके संदर्भ के लिए जोड़ देंगे:

वास्तविक आप कर सकते थे

1.Reflection

public void Map<TSource, TDestination>(TSource source, TDestination destination) 
{ 
    var props = typeof(TSource).GetProperties(BindingFlags.Public | BindingFlags.Instance); 
    var type = typeof(TDestination); 

    foreach (var prop in props) 
    { 
    object value = prop.GetValue(source, null); 

    var prop2 = type.GetProperty(prop.Name); 
    if (prop2 == null) 
     continue; 

    if (prop.PropertyType != prop2.PropertyType) 
     continue; 

    prop2.SetValue(destination, value, null); 
    } 
} 

2.Copy निर्माता

public Employee(Person person) 
{ 
    // Copy properties 
} 

3.Implicit/स्पष्ट रूपांतरण

public static implicit operator Employee(Person person) 
{ 
    // Build instance and return 
} 

4.AutoMapper

3/4 की
Mapper.Map<Person, Employee>(person); 

5.Combination:

public static implicit operator Employee(Person person) 
{ 
    return Mapper.Map<Person, Employee>(person); 
} 

अंतर्निहित/स्पष्ट रूपांतरण ऑपरेटरों पर एक नोट: मेरा मानना ​​है कि इन का उपयोग करने में आप नहीं होगी सीएलएस-अनुरूप कोड।

AutoMapper आप को अनुकूलित करने के गुण कैसे अलग लक्ष्य प्रकार पर अधिक मैप की जाती हैं, उदा .:

Mapper.CreateMap<Person, Employee>() 
     .ForMember(e => e.Forename, o => o.MapFrom(p => p.Forename.ToLower())); 
0

आप उत्पाद से PendingProduct प्राप्त करना चाहते हैं नहीं चाहेंगे अनुमति देता है?

public class Product 
{  
    public string Name { get; set; }  
    public string Description { get; set; }  
    public ProductColors Colors { get; set; } 
} 

public class PendingProduct : Product 
{   
    public int ColorCount { get; set; } 
} 
संबंधित मुद्दे