2010-08-11 14 views
5

Enum के लिए आवश्यकता को देखते हुए:AutoMapper तार विवरण

, एक वस्तु ग्राफ लो सेट सब enum प्रकार एक दूसरी स्ट्रिंग संपत्ति का संसाधित मूल्य के आधार पर गुण। सम्मेलन का निर्देश है कि स्रोत स्ट्रिंग संपत्ति का नाम enum संपत्ति का "कच्चा" के पोस्टफिक्स के साथ होगा।

संसाधित करके हमारा मतलब है कि हमें निर्दिष्ट वर्ण e.t.c. को पट्टी करने की आवश्यकता होगी।

मैंने कस्टम स्वरूपक, मूल्य संकल्पक और प्रकार कनवर्टर्स को देखा है, इनमें से कोई भी इसके लिए समाधान की तरह नहीं दिखता है?

हम दो कारणों से अपने स्वयं के प्रतिबिंब दिनचर्या के विपरीत ऑटोमैपर का उपयोग करना चाहते हैं, ए) इसका उपयोग बाकी परियोजना के दौरान बड़े पैमाने पर किया जाता है और बी) यह आपको रिकर्सिव ट्रैवर्सल ओटब देता है।

- उदाहरण -

(सरल) नीचे संरचना को देखते हुए, और इस:

var tmp = new SimpleClass 
    { 
     CountryRaw = "United States", 
     Person = new Person { GenderRaw="Male" } 
    }; 

var tmp2 = new SimpleClass(); 

Mapper.Map(tmp, tmp2); 

हम tmp2 के MappedCountry enum उम्मीद थी Country.UnitedStates और व्यक्ति संपत्ति एक है करने के लिए होने के लिए लिंग का लिंग। मैले।

public class SimpleClass1 
{ 
    public string CountryRaw {get;set;} 

    public Country MappedCountry {get;set;} 

    public Person Person {get;set;} 
} 

public class Person 
{ 
    public string GenderRaw {get;set;} 

    public Gender Gender {get;set;} 

    public string Surname {get;set;} 
} 

public enum Country 
{ 
    UnitedStates = 1, 
    NewZealand = 2 
} 

public enum Gender 
{ 
    Male, 
    Female, 
    Unknown 
} 

धन्यवाद

+1

आप तुम्हारे पास क्या है का एक उदाहरण दिखा सकता है और आप इसे – Omu

+0

ज़रूर, संपादित मूल पोस्ट :-) – 6footunder

उत्तर

5

मैं ValueInjecter साथ यह किया है, यहाँ पूरी बात है: बस आप को दिखाने के लिए यह कैसे काम करता

मैं SimpleClass के लिए एक और प्रोप जोड़ दिया है

public class SixFootUnderTest 
{ 
    [Test] 
    public void Test() 
    { 
     var o = new SimpleClass1 
        { 
         CountryRaw = "United States", 
         GenderRaw = "Female", 
         Person = new Person { GenderRaw = "Male" } 
        }; 

     var oo = new SimpleClass1(); 

     oo.InjectFrom(o) 
      .InjectFrom<StrRawToEnum>(o); 
     oo.Person.InjectFrom<StrRawToEnum>(o.Person); 

     oo.Country.IsEqualTo(Country.UnitedStates); 
     oo.Gender.IsEqualTo(Gender.Female); 
     oo.Person.Gender.IsEqualTo(Gender.Male); 
    } 

    public class SimpleClass1 
    { 
     public string CountryRaw { get; set; } 

     public Country Country { get; set; } 

     public string GenderRaw { get; set; } 

     public Gender Gender { get; set; } 

     public Person Person { get; set; } 
    } 

    public class Person 
    { 
     public string GenderRaw { get; set; } 

     public Gender Gender { get; set; } 

     public string Surname { get; set; } 
    } 


    public class StrRawToEnum : LoopValueInjection 
    { 
     protected override bool UseSourceProp(string sourcePropName) 
     { 
      return sourcePropName.EndsWith("Raw"); 
     } 

     protected override string TargetPropName(string sourcePropName) 
     { 
      return sourcePropName.RemoveSuffix("Raw"); 
     } 

     protected override bool TypesMatch(Type sourceType, Type targetType) 
     { 
      return sourceType == typeof(string) && targetType.IsEnum; 
     } 

     protected override object SetValue(object sourcePropertyValue) 
     { 
      return Enum.Parse(TargetPropType, sourcePropertyValue.ToString().Replace(" ", ""), true); 
     } 
    } 

    public enum Country 
    { 
     UnitedStates = 1, 
     NewZealand = 2 
    } 


    public enum Gender 
    { 
     Male, 
     Female, 
     Unknown 
    } 
} 

यदि आपको CountryRaw से मैपड कैंट्री से ऐसा करने की आवश्यकता है तो आप इसे ऐसा कर सकते हैं:

oo.InjectFrom(new StrRawToEnum().TargetPrefix("Mapped"), o); 
+2

इस मैप करना चाहते हैं के लिए, मेरे दोस्त, एक बहुत साफ हल है! धन्यवाद :-)। – 6footunder

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