2010-08-11 2 views
5

로부터 ENUM :AutoMapper 문자열 요구 주어 설명

번째 문자열 속성 처리 값에 기초하여 모두 열거 형 속성 설정 객체 그래프를 타고. 규약에 따르면 원본 문자열 속성의 이름은 "Raw"라는 접미사가있는 enum 속성의 이름이됩니다.

처리하면 우리는 지정된 문자를 제거해야 함을 의미합니다.

저는 맞춤 포맷터, 값 확인자 및 유형 변환기를 살펴 보았지만 그 중 어떤 것도 해결책이 아닌 것으로 보입니까?

AutoMapper를 우리 자신의 리플렉션 루틴과 반대로 사용하려면 다음과 같은 두 가지 이유가 필요합니다. a) 프로젝트의 나머지 부분에서 광범위하게 사용되며, b) 반복적 인 순회를 제공합니다.

- 예 - 다음 (단순) 구조를 감안할 때

,이 :

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

var tmp2 = new SimpleClass(); 

Mapper.Map(tmp, tmp2); 

우리가 Country.UnitedStates과를 가지고있는 사람의 재산을 tmp2의 MappedCountry 열거를 기대 성별의 성별. 남성.

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에서 MappedCountry 에해야 할 경우에 대비하여 다음과 같이 할 수 있습니다.

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

이 :-) – 6footunder