2012-09-26 21 views
8

ソースタイプに設定されたEnum値に基づいて、Automapperがマップするコールの宛先タイプを選択する方法を見つけようとしています。Automapperは、ソースタイプの列挙型の値に基づいて宛先タイプを解決します

たとえば

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

を、私はクラスを持っていることのviewmodelの表現にこれをマッピングする:

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を含むOrganisationViewModelが作成されます。

Automapperコール:

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

どのように私はこれをサポートするためにAutomapperの設定に行きますか?これは可能ですか? (この質問がクリアであることを願っています)

ありがとう!

+0

私はこれを見て、2つのタイプの代わりに 'Metric 'に戻ります。たとえば、 'int Value'と' string Value'の両方にIMetricViewModelsが実装されているとします。あなたのインターフェースはどのように見えますか? – hometoast

+0

こんにちは、この例は実際の問題よりはるかに単純です.MetricTypeにはさまざまな種類のものがたくさんあります。インタフェースは空であり、そこには私がすべて異なるビューテンプレートに解決されるもののリストを持たせるためだけにあります。 (MVC app ... Html.DisplayFor(Organisation.Metrics)は、6つまたは7つの異なるテンプレートのリストになります)。それは理にかなっているのですか? – Paul

答えて

3

[OK]を、私は、メトリック一部のための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}; 
     } 

    } 
} 

これは正しいアプローチのようですか?その他のガイダンスは?

+0

これを動作させることができましたか?私はそれを働かせるように見えません。 –

関連する問題