2014-12-05 4 views
1

Есть ли способ сопоставить статические классы с AutoMapper?Карта статических классов с AutoMapper

Сценарий выглядит следующим образом. Существует статический класс, называемый UserIdentity, и он содержит свойства. Я хочу сопоставить UserIdentity значениям класса для моего статического класса с именем UserDTO.

Когда я попытался

AutoMapper.Mapper.CreateMap<UserIdentity, UserDTO>(); 

Там ошибка говоря,

static type cannot be used as type arguments 

Теперь может кто-нибудь объяснить мне об этом случае и это достижимо или нет. И есть ли способ сопоставить статические классы без использования Automapper. В противном случае я должен сделать это вручную.

ответ

0

К сожалению, вы не можете использовать automapper на статических классах

Кроме того, существует очень ограниченный набор ситуаций, в которых вы можете ссылаться на статические типы классов, которые также будут делать другие подходы сложные

Статических классов предотвратить неприемлемыми поэтому почти во всех ситуациях вы не можете использовать их в ситуациях, когда обычно требуется экземпляр типа ... и который включает аргументы типа.

Единственный способ, которым я могу видеть, чтобы достичь желаемых результатов, чтобы создать поле с помощью отображения поля функции вашей собственной

Все, что Вы можете заставить automapper использовать фиктивный класс, вы все еще отображения поля на поле в любом случае , мой голос, чтобы уменьшить сложность и просто использовать что-то вроде следующего

public static SomeDTO CreateDTO() 
    { 
    return new SomeDTO 
     { 
      dest.Name = UserIdentity.Name; 
      dest.Id = UserIdentity.Id; 
      ect.. 
     } 
    } 
+0

Можете ли вы дать мне пример кода, чтобы получить представление о создании поля с помощью функции сопоставления полей? – Wiki

1

единственный способ сделать это было бы использовать фиктивный класс для выполнения отображения не-оп. Затем вы можете использовать настраиваемый конвертер типов или функцию сопоставления или просто сделать что-то вроде этого:

Mapper.CreateMap<Dummy, Dest>() 
    .AfterMap((src, dest) => 
    { 
     dest.Name = UserIdentity.Name; 
     dest.Id = UserIdentity.Id; 
     //.... etc.. 
    }); 
+0

Итак, перефразируя, нет, вы не можете. И в этом случае, почему включить AutoMapper вообще? В любом случае, если вы собираетесь в конечном итоге сопоставить свойства вручную. –

+0

@AndrewTheken - хорошо, если вы уже используете AutoMapper для других целей, имеет смысл сохранить все ваши сопоставления с использованием аналогичных шаблонов для согласованности, даже если это означает выполнение некоторых работ, чтобы заставить некоторые типы работать. –

+0

С уважением, я думаю, что это вопрос стиля, и я думаю, я просто не согласен с тем, что добавление кода, который ничего не делает, даже если он «соответствует стилю», способствует читабельности, когда исходный C# будет менее «волшебным» «. –

Смежные вопросы