9

Source タイプに設定された Enum 値に基づいて、Automapper が map の呼び出しの宛先タイプを選択する方法を見つけようとしています...

たとえば、次のクラスがあるとします。

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 を呼び出すと、1 つの NumericMetric と 1 つの TextMetric を含む OrganizationViewModel が生成されます。

オートマッパーの呼び出し:

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 に答える