将一种类型的poco转移/强制转换为另一种类型的poco的优雅方法是什么?名称空间不同,但名称和字段相同

本文关键字:类型 poco 是什么 方法 字段 空间 另一种 一种 转移 转换 | 更新日期: 2023-09-27 18:12:50

假设你有一个域层,它返回一个User对象:

public class User
{
   public string FirstName{get;set;}
   public string LastName{get;set;}
}

假设您在服务层中定义了一个相同的类。有什么优雅的方法可以轻松地将域用户对象转换为服务用户对象?

将一种类型的poco转移/强制转换为另一种类型的poco的优雅方法是什么?名称空间不同,但名称和字段相同

"优雅"是主观的。我可能只是写一个扩展,将一个转换为另一个。

public static class MappingExtensions
{
    public ThisNameSpace.User ToThisUser(this OtherNameSpace.User source)
    {
        return new ThisNameSpace.User
        {
            FirstName = source.FirstName,
            LastName = source.LastName,
            UserId = source.UserId
        }
    }
}

对我来说这是最简单的。

你也可以使用Automapper (add from Nuget.)

一次性配置:

AutoMapper.Mapper.Initialize(c=>c.CreateMap<User,Other.User>());

,然后你可以调用它来映射User的实例到Other.User的新实例。

var other = AutoMapper.Mapper.Map<Other.User>(user);

如果属性名称和类型相同,则不需要指定单个属性的映射。

你可以使用反射:

using System.Windows.Forms;
using System.Reflection;
namespace First
{
    public class User
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string UserID { get; set; }
        public User()
        {
        }
    }
}
namespace Second
{
    public class User
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string UserID { get; set; }
        public User()
        {
        }
    }
}
namespace YetAnotherNamespace
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            First.User user = new First.User()
            {
                FirstName = "John",
                LastName = "Public",
                UserID = "jpublic@mydomain.com"
            };
            Second.User newUser = ConvertUser(user);
        }
        public Second.User ConvertUser(First.User oldUser)
        {
            Second.User newUser = new Second.User();
            foreach (PropertyInfo prop in oldUser.GetType().GetProperties())
            {
                string propertyName = prop.Name;
                object propertyValue = prop.GetValue(oldUser);
                newUser.GetType().GetProperty(propertyName).SetValue(newUser, propertyValue);
            }
            return newUser;
        }
    }
}

在这个代码示例中,当我实例化表单时,我创建了First。User并转换为Second.User.

经过测试并正常工作(作为强类型方法)。我认为你可以让它更通用,接受并返回一个"对象"如果属性不匹配,它会抛出一个异常。还要记住,反射往往很慢——这可能不是最可扩展的解决方案。

另一种方法是序列化为json,然后反序列化为另一种类型。