将一种类型的poco转移/强制转换为另一种类型的poco的优雅方法是什么?名称空间不同,但名称和字段相同
本文关键字:类型 poco 是什么 方法 字段 空间 另一种 一种 转移 转换 | 更新日期: 2023-09-27 18:12:50
假设你有一个域层,它返回一个User对象:
public class User
{
public string FirstName{get;set;}
public string LastName{get;set;}
}
假设您在服务层中定义了一个相同的类。有什么优雅的方法可以轻松地将域用户对象转换为服务用户对象?
"优雅"是主观的。我可能只是写一个扩展,将一个转换为另一个。
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,然后反序列化为另一种类型。