【问题标题】:Automapper and Open GenericsAutomapper 和开放泛型
【发布时间】:2015-10-28 10:48:18
【问题描述】:

我正在尝试使用 https://github.com/AutoMapper/AutoMapper/wiki/Open-Generics 中所述的 Automapper 的开放泛型来执行用户和帐户之间的映射。

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

但我得到一个例外

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

映射类型:用户 -> 帐户 OpenGenerics.Console.Models.User -> OpenGenerics.Console.Models.Account

目标路径:Destination`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>();

【问题讨论】:

    标签: generics automapper open-generics


    【解决方案1】:

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

    Mapper.CreateMap<User, Account>();
    

    你已经准备好了。

    【讨论】:

    • 希望不是这样!在我的实际应用程序中,帐户是在 MVC 项目中定义的,用户是在服务项目中定义的。 Service 项目没有对 MVC 项目的引用,所以我无法按照您建议的方式进行映射。我可以这样做 Mapper.CreateMap();但每次调用 GetAccountFromUser() 方法时都会执行此操作。
    • 呃。我讨厌这样的项目布局。只需将所有内容放在一个项目中并使用文件夹即可。
    • 那艘船已经航行了!
    • 为问题添加了一个潜在的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-23
    • 2023-03-31
    • 2016-08-11
    • 1970-01-01
    相关资源
    最近更新 更多