2012-09-26 24 views
8

Tôi đang cố gắng tìm một cách để Automapper chọn loại đích của cuộc gọi đến bản đồ, dựa trên một giá trị Enum được đặt trong loại Nguồn .. .Loại đích xác định của máy tự động dựa trên giá trị của một enum trong loại nguồn

ví dụ: Căn cứ vào các lớp học sau:

public class Organisation 
{ 
    public string Name {get;set;} 
    public List<Metric> Metrics {get;set;} 
} 

public class Metric 
{ 
    public int NumericValue {get;set;} 
    public string TextValue {get;set;} 
    public MetricType MetricType {get;set;} 
} 

public enum MetricType 
{ 
    NumericMetric, 
    TextMetric 
} 

Nếu tôi có các đối tượng sau đây:

var Org = new Organisation { 
    Name = "MyOrganisation", 
    Metrics = new List<Metric>{ 
     new Metric { Type=MetricType.TextMetric, TextValue = "Very Good!" }, 
     new Metric { Type=MetricType.NumericMetric, NumericValue = 10 } 
    } 
} 

Bây giờ, tôi muốn để lập bản đồ này để đến một đại diện viewmodel của nó trong đó có các lớp:

public class OrganisationViewModel 
{ 
    public string Name {get;set;} 
    public List<IMetricViewModels> Metrics {get;set;} 
} 

public NumericMetric : IMetricViewModels 
{ 
    public int Value {get;set;} 
} 

public TextMetric : IMetricViewModels 
{ 
    public string Value {get;set;} 
} 

Cuộc gọi đến AutoMapper.Map sẽ dẫn đến một OrganisationViewModel chứa một NumericMetric và một TextMetric.

Các Automapper gọi:

var vm = Automapper.Map<Organisation, OrganisationViewModel>(Org); 

Làm thế nào tôi sẽ đi về Cấu hình Automapper để hỗ trợ này? Điều này có thể không? (Tôi hy vọng câu hỏi này là rõ ràng)

Cảm ơn!

+0

Tôi tiếp tục xem xét điều này và tiếp tục quay lại 'Metric ' thay vì hai loại. Ví dụ, làm thế nào để bạn có cả 'int Value' và' string Value' cả hai đều triển khai thực hiện IMetricViewModels. Giao diện của bạn trông như thế nào? – hometoast

+0

Xin chào, Ví dụ này đơn giản hơn nhiều so với vấn đề thực tế, có khá nhiều loại khác nhau trong MetricType tất cả chứa nhiều thứ khác nhau. Giao diện trống, và chỉ ở đó để cho phép tôi có một danh sách những thứ mà tất cả sẽ giải quyết cho một mẫu xem khác nhau. (Ứng dụng MVC ... Html.DisplayFor (Organisation.Metrics) sẽ dẫn đến danh sách 6 hoặc 7 mẫu khác nhau). Điều đó có ý nghĩa hay tôi nên mở rộng câu hỏi? – Paul

Trả lời

3

Ok, tôi đang nghĩ đến vào lúc này là cách tốt nhất để đạt được một điều như vậy sẽ có một TypeConverter cho phần số liệu ... Một cái gì đó như:

AutoMapper.Mapper.Configuration 
     .CreateMap<Organisation, OrganisationViewModel>(); 

AutoMapper.Mapper.Configuration 
     .CreateMap<Metric, IMetricViewModels>() 
     .ConvertUsing<MetricTypeConverter>(); 

Sau đó TypeConverter sẽ giống như thế này:

public class MetricTypeConverter : AutoMapper.TypeConverter<Metric, IMetricViewModel> 
{ 
    protected override IMetricViewModelConvertCore(Metric source) 
    { 
     switch (source.MetricType) 
     { 
      case MetricType.NumericMetric : 
       return new NumericMetric {Value = source.NumericValue}; 

      case MetricType.TextMetric : 
       return new TextMetric {Value = source.StringValue}; 
     } 

    } 
} 

Đây có phải là cách tiếp cận phù hợp ở đây không? Bất kỳ hướng dẫn nào khác?

+0

Bạn có thể làm việc này không? Tôi không thể làm cho nó hoạt động được. –

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