将一个模型转换为另一个模型的通用方法

Er_*_*iya 2 c# generics model-view-controller model

我有两个模型UserUserModelDto都有一些共同的属性,从客户端我得到了UserModelDto模型,我想将其转换为User以插入数据库(我正在使用实体框架)。当它将UserModelD 的所有属性值转换为UserModelD 时,我想将该属性是否包含值复制到User 中,如果不包含,则手动分配给它的适当值(如空值)。我希望它以通用方式。模型 用户看起来像

 public partial class User
{
    public User()
    {
        this.UserRoles = new HashSet<UserRole>();
    }

    public int Id { get; set; }
    public string UserName { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string EmailId { get; set; }
    public string Password { get; set; }
    public Nullable<int> ManagerId { get; set; }
    public byte AuthenticationType { get; set; }
    public Nullable<bool> RememberMe { get; set; }
    public Nullable<bool> IsActive { get; set; }
    public Nullable<bool> IsOnVacation { get; set; }
    public Nullable<bool> IsManager { get; set; }
    public Nullable<int> CreatedBy { get; set; }
    public Nullable<int> UpdatedBy { get; set; }
    public Nullable<System.DateTime> CreatedOn { get; set; }
    public Nullable<System.DateTime> UpdatedOn { get; set; }
    public int LoginAttempts { get; set; }
    public bool ResetPassword { get; set; }
    public Nullable<System.DateTime> LastDealAssignedDateTime { get; set; }

    public virtual ICollection<UserRole> UserRoles { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

和模型UserModelD看起来像....

public class UserModelDto
{
    public int UserId { get; set; }
    public string UserName { get; set; }
    public byte AuthenticationType { get; set; }
    public string EmailId { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public bool IsOnVacation { get; set; }
    public bool IsManager { get; set; }
    public bool IsActive { get; set; }
    public int ManagerId { get; set; }
    public int PrimaryRoleid { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我试过的是

 public User ConvertToUserModel(UserModelDto userModel)
    {
        User convertedUser = new User();
        if (userModel!=null)
        {
            convertedUser.Id = userModel.UserId != null ? userModel.UserId : 0;
            convertedUser.AuthenticationType = userModel.AuthenticationType != null ? userModel.AuthenticationType : 0;
            convertedUser.EmailId = userModel.EmailId != null ? userModel.EmailId :null;
            convertedUser.FirstName = userModel.FirstName != null ? userModel.FirstName : null;
            convertedUser.LastName = userModel.LastName != null ? userModel.LastName : null;
            convertedUser.IsOnVacation = userModel.IsOnVacation != null ? userModel.IsOnVacation : false;
            convertedUser.IsActive = userModel.IsActive != null ? userModel.IsActive : false;
            convertedUser.IsManager = userModel.IsManager != null ? userModel.IsManager : false;
            convertedUser.ManagerId = userModel.ManagerId != null ? userModel.ManagerId :0;
            convertedUser.UserName = userModel.UserName != null ? userModel.UserName :null; 
        }
        return convertedUser;
    }
Run Code Online (Sandbox Code Playgroud)

trm*_*ler 5

我建议你看看像Automapper这样的东西,它完全符合你的要求。它允许你有很多配置选项,我已经多次将它用于这个确切的用例。

这就是您实际上会做的事情。

//Type on left is source type, type on right is destination
Mapper.CreateMap<UserModelDto, User>();

User user = Mapper.Map<User>(userDto);
Run Code Online (Sandbox Code Playgroud)

如果要从其他的方式UserDtoUser,你只需创建一个翻转的类型的新映射,并遵循相同的模式。

有一个很好的深度视频,为您提供了更多关于 Automapper 可以做什么的示例,但在这种情况下,默认配置应该可以正常工作。