2014-11-16 2 views
0

Я пытаюсь сопоставить тип источника для двух типов назначения с помощью AutoMapper:AutoMapper с более чем одним типом назначения

public class Source 
{ 
    public string Value1 { get; set; } 

    public string Value2 { get; set; } 

    public Source[] Values { get; set; } 
} 

public interface IDest 
{ 
} 

public class DestinationSimple : IDest 
{ 
    public string Value1 { get; set; } 
} 

public class DestinationComplex : IDest 
{ 
    public string Value2 { get; set; } 

    public IDest[] Values { get; set; } 
} 

типа назначения для сопоставления должны быть на основе значений свойств в типе источника. Если Value1 в Source не является нулевым, тип назначения должен быть DestinationSimple. В противном случае тип назначения должен быть DestinationComplex.

В каком виде лучше всего продолжить? Я попытался использовать настраиваемый конвертер типов, но я не мог заставить его работать, потому что я не знал, как обращаться с свойством Values.

+0

Я бы сделать шаг назад и спросить себя, если вы действительно должны хранить SourceSimple и SourceComplex в одном классе и делать смешную логику, чтобы справиться с этим. Можете ли вы заранее определить, к какому типу вы пытаетесь получить доступ? Потому что вместо этого вы можете создать 2 разных пути выполнения в зависимости от ответа на этот вопрос. –

+0

SourceSimple и SourceComplex, возможно, не должны храниться в одном классе. Но класс мне дан, поэтому изменить это не так просто. Боюсь, я не могу заранее определить, к какому типу я пытаюсь получить доступ. – user3660151

ответ

0

Вот один из способов вы можете сделать это, используя пользовательский тип преобразователя:

public class IDestConverter : TypeConverter<Source, IDest> 
{ 
    protected override IDest ConvertCore(Source src) 
    { 
     IDest result = null; 

     if (src.Value1 != null) 
     { 
      result = new DestinationSimple 
      { 
       Value1 = src.Value1 
      }; 
     } 
     else 
     { 
      result = new DestinationComplex 
      { 
       Value2 = src.Value2, 
       Values = Mapper.Map<IDest[]>(src.Values) 
      }; 
     } 

     return result; 
    } 
} 

Использование:

Mapper.CreateMap<Source, IDest>() 
    .ConvertUsing<IDestConverter>(); 
Смежные вопросы