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

时间:2015-03-19 14:44:03

标签: c# generics model-view-controller model

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

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

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

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

我尝试的是

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

2 个答案:

答案 0 :(得分:4)

我建议您查看Automapper之类的内容,它完全符合您的要求。它允许您使用许多配置选项,并且我已经多次将它用于这个确切的用例。

这是你真正要做的事情。

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

User user = Mapper.Map<User>(userDto);

要从UserDto转到User,您只需创建一个翻转类型的新映射器,并按照相同的模式。

有一个nice in depth video可以为您提供更多关于使用Automapper可以做些什么的示例,但在这种情况下,默认配置应该可以正常工作。

答案 1 :(得分:2)

我使用名为AutoMapper的实用程序: https://www.nuget.org/packages/AutoMapper/

这允许您将一个对象转换为另一个对象,简单如下:

User mappedUser = AutoMapper.Map<User>(userModelDto);

虽然可以在配置中定义特殊的映射规则,但这会自动映射相同类型和名称的属性。