2015-08-05 6 views
1

Я пытаюсь использовать Open Generics Automapper, как описано в https://github.com/AutoMapper/AutoMapper/wiki/Open-Generics, для выполнения сопоставления между пользователем и учетной записью.Automapper и Open Generics

public class User 
{ 
    public Guid UserId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public DateTime Dob { get; set; } 
} 

public class Account 
{ 
    public Guid UserId { get; set; } 
    public string FirstName { get; set; } 
} 

Я создал источник и назначение

public class Source<T> 
{ 
    public T Value { get; set; } 
} 

public class Destination<T> 
{ 
    public T Value { get; set; } 
} 

Я хочу, чтобы выполнить отображение в AccountService

public class AccountService 
{ 
    private User user1 = new User{FirstName = "James", LastName = "Jones", Dob = DateTime.Today, UserId = new Guid("AC482E99-1739-46FE-98B8-8758833EB0D2")}; 

    static AccountService() 
    { 
     Mapper.CreateMap(typeof(Source<>), typeof(Destination<>)); 
    } 

    public T GetAccountFromUser<T>() 
    { 
     var source = new Source<User>{ Value = user1 }; 
     var destination = Mapper.Map<Source<User>, Destination<T>>(source); 
     return destination.Value; 
    } 
} 

Но я получаю исключение

отсутствующей карты типа конфигурации или неподдерживаемого сопоставления.

типов отображения: User -> Account OpenGenerics.Console.Models.User -> OpenGenerics.Console.Models.Account

назначения Путь: Destination`1.Value.Value

значение Источник: OpenGenerics .Console.Models.User

Я подтвердил подход в https://github.com/AutoMapper/AutoMapper/wiki/Open-Generics работ по int и double

Редактировать Это может быть решением для меня, но это немного грязно.

var mappingExists = Mapper.GetAllTypeMaps().FirstOrDefault(m => m.SourceType == typeof (User) && m.DestinationType == typeof (T)); 
    if (mappingExists == null) 
     Mapper.CreateMap<User, T>(); 

ответ

1

Для закрытых дженериков параметры типа также должны быть сопоставлены. Добавьте это:

Mapper.CreateMap<User, Account>(); 

И вы настроены.

+0

Надеюсь, этого не было! В моем реальном приложении Учетная запись определена в проекте MVC, и Пользователь определен в проекте службы. Проект службы НЕ имеет ссылку на проект MVC, поэтому я не могу сопоставить то, что вы предлагаете. Я могу сделать это Mapper.CreateMap (); но это выполняется для каждого вызова метода GetAccountFromUser (). – Bryan

+1

Ugh. Я ненавижу проектные макеты, подобные этому. Просто поместите все в один проект и используйте папки. –

+0

Этот корабль отплыл! – Bryan