9

我正在尝试找到一种方法,让 Automapper 根据 Source 类型中设置的 Enum 值来选择调用映射的目标类型...

例如,给定以下类:

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 来支持这一点?这可能吗?(我希望这个问题很清楚)

谢谢!

4

1 回答 1

2

好的,我目前正在考虑实现这一目标的最佳方法是使用 TypeConverter 作为度量部分......类似于:

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

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

然后 TypeConverter 看起来像这样:

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

    }
}

这似乎是正确的方法吗?还有其他指导吗?

于 2012-09-26T15:31:26.157 回答