Automapper和Open Generics

时间:2015-08-05 15:06:57

标签: generics automapper open-generics

我尝试使用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;
    }
}

但我得到了一个例外

  

缺少类型映射配置或不支持的映射。

     

映射类型:用户 - &gt;帐号OpenGenerics.Console.Models.User - &gt;   OpenGenerics.Console.Models.Account

     

目的地路径:目的地`1.Value.Value

     

来源值:OpenGenerics.Console.Models.User

我确认https://github.com/AutoMapper/AutoMapper/wiki/Open-Generics中的方法适用于intdouble

修改 这对我来说可能是一个解决方案,但它有点混乱。

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

1 个答案:

答案 0 :(得分:2)

对于封闭的泛型,还需要能够映射类型参数。加上这个:

Mapper.CreateMap<User, Account>();

你已经定下来了。