2013-06-21 6 views
7

मैं ऑटोमैपर के लिए नया हूं, इसलिए मुझे यकीन नहीं है कि यह संभव है या नहीं।Automapper शून्य विधियों को अनदेखा कर सकते हैं?

मैं एक कक्षा को मानचित्र बनाना चाहता हूं, लेकिन इसे शून्य विधियों को अनदेखा करने के लिए प्राप्त करें। नीचे मेरे पास कोड का एक उदाहरण है। जब मैं इसे चलाता हूं तो मुझे निम्न अपवाद संदेश मिलता है।

प्रकार के 'AutoMapper.AutoMapperMappingException' एक बिना क्रिया का अपवाद AutoMapper.dll में हुई

दुर्भाग्य से यह इंटरफ़ेस बदलने के लिए एक विकल्प नहीं है, इसलिए मैं अगर यह संभव है कि कुछ है मान कॉन्फ़िगरेशन की तरह मैं याद कर रहा हूँ?

public interface IThing 
{ 
    string Name { get; set; } 
    void IgnoreMe(); 
} 

public class Foo : IThing 
{ 
    public string Name { get; set; } 

    public void IgnoreMe() 
    { 
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var fooSource = new Foo {Name = "Bobby"}; 
     Mapper.CreateMap<IThing, IThing>(); 

     var fooDestination = Mapper.Map<IThing>(fooSource); 
     Console.WriteLine(fooDestination.Name); 
     Console.ReadLine(); 
    } 
} 
+0

मैप कर सकते आप निर्दिष्ट करने के लिए जो कार्यान्वयन Automapper बनाना चाहिए 'ConstructUsing' उपयोग कर सकते हैं:' Mapper.CreateMap ()। कंस्ट्रक्चरिंग ((रेज़ोल्यूशन कॉन्टेक्स्ट सी) => नया फू()); ' – nemesv

+0

@nemesv धन्यवाद, यह काम किया! –

+0

जिस तरह से आप 'आईटिंग' का उपयोग गंतव्य प्रकार के रूप में कर रहे हैं? क्योंकि 'Mapper.CreateMap ();' भी काम करेगा ... – nemesv

उत्तर

7

आप an interface as a destination प्रकार AutoMapper गतिशील एक कार्यान्वयन (प्रॉक्सी) पैदा करेगा आप के लिए टाइप करें उपयोग कर रहे हैं।

हालांकि प्रॉक्सी पीढ़ी केवल गुण का समर्थन करता है, तो यह आपके IgnoreMe विधि के लिए यह नहीं भी वर्णनात्मक अपवाद फेंकता है। तो आप अपने IgnoreMe विधि को अनदेखा नहीं कर सकते हैं।

एक वर्कअराउंड के रूप में आप स्पष्ट रूप से निर्दिष्ट कर सकते हैं कि इस मामले में ConstructUsing अधिभारों में से किसी एक का उपयोग करके गंतव्य ऑब्जेक्ट्स का निर्माण कैसे किया जाना चाहिए ऑटोमैपर प्रॉक्सी उत्पन्न नहीं करता है।

Mapper.CreateMap<IThing, IThing>() 
     .ConstructUsing((ResolutionContext c) => new Foo()); 

या जब तक आप कोई अच्छा कारण है, तो आप सीधे Foo

Mapper.CreateMap<IThing, Foo>(); 
संबंधित मुद्दे