2010-08-11 34 views
5

Với yêu cầu:chuỗi AutoMapper để enum thiệu

Tham dự một đồ thị đối tượng, thiết lập tất cả các thuộc tính kiểu enum dựa trên xử lý giá trị của một tài sản chuỗi thứ hai. Công ước quy định rằng tên của thuộc tính chuỗi nguồn sẽ là thuộc tính enum với một postfix là "Raw".

Bằng cách xử lý, chúng tôi có nghĩa là chúng tôi cần phải loại bỏ các ký tự được chỉ định e.t.c.

Tôi đã xem xét các trình định dạng tùy chỉnh, trình phân giải giá trị và trình chuyển đổi loại, không cái nào trong số đó có vẻ như là giải pháp cho điều này?

Chúng tôi muốn sử dụng AutoMapper thay vì thói quen phản chiếu của chúng tôi vì hai lý do, a) nó được sử dụng rộng rãi trong suốt phần còn lại của dự án và b) nó cung cấp cho bạn ootb truyền tải đệ quy.

- Ví dụ -

Do (đơn giản) cấu trúc bên dưới, và điều này:

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

var tmp2 = new SimpleClass(); 

Mapper.Map(tmp, tmp2); 

chúng tôi mong đợi MappedCountry enum tmp2 để được Country.UnitedStates và tài sản Người để có một giới tính của Gender.Male.

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 
} 

Cảm ơn

+1

bạn có thể hiển thị ví dụ về những gì bạn có và những gì bạn muốn ánh xạ nó không? – Omu

+0

Chắc chắn, đã chỉnh sửa bài đăng gốc :-) – 6footunder

Trả lời

5

tôi đã làm nó với ValueInjecter, đây là toàn bộ sự việc:

Tôi đã thêm một chỗ dựa hơn với SimpleClass chỉ để cho bạn thấy cách thức hoạt động

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 
    } 
} 

cũng trong trường hợp bạn cần thực hiện điều đó từ CountryRaw tới MappedCountry bạn có thể làm như sau:

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

Điều này, bạn tôi, là một giải pháp rất sạch sẽ! Cảm ơn :-). – 6footunder

Các vấn đề liên quan