2012-09-26 44 views
8

我试图找到一种方法让Automapper根据源类型中设置的Enum值选择映射调用的目标类型。 。Automapper根据源类型中枚举的值解析目标类型

eg鉴于以下类:

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 
} 

如果我有以下对象:

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

现在,我想这个映射到它的视图模型表示它具有类:

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

对AutoMapper.Map的调用将导致包含一个NumericMetric和一个TextMetric的OrganisationViewModel。

的Automapper电话:

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

我怎么会去配置Automapper支持呢?这可能吗? (我希望这个问题很清楚)

谢谢!

+0

我一直在看这个,并继续回到'公制'而不是两种类型。例如,你如何同时使用'int Value'和'string Value'来实现IMetricViewModels。你的界面是什么样的? – hometoast

+0

嗨,这个例子比实际问题简单得多,MetricType中有很多不同类型,都包含各种不同的东西。该界面是空的,只有在那里让我有一个事情的列表,这些列表将全部解析为不同的视图模板。 (MVC应用程序... Html.DisplayFor(Organisation.Metrics)将生成6或7个不同模板的列表)。这有道理吗?还是我应该扩展这个问题? – Paul

回答

3

好吧,我想此刻要达到这样的事情是与度量部分的TypeConverter,最好的办法...喜欢的东西:

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

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

然后类型转换器会看起来像这:

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

    } 
} 

这似乎是正确的方法吗?任何其他指导?

+0

你能够得到这个工作?我似乎无法得到它的工作。 –