将一个对象转换为另一个对象

5

我有两个用户定义的CLR对象,它们完全相同,只是名称不同。例如,这段代码:

public class Person
{
  public string Name { get; set; }
  public string Address { get; set; }
  public string LastName { get; set; }
  public string ETC { get; set; }
}

public class PersonData
{
  public string Name { get; set; }
  public string Address { get; set; }
  public string LastName { get; set; }
  public string ETC { get; set; }
}

我知道可以通过创建CLR的对象,然后逐个传递所有属性来完成这个任务。
但是否有另一种方法呢?我有几个属性很多的CLR,每个CLR有15个以上的属性。
[编辑] 更多的上下文信息:这些类已经存在了。我使用Entity Framework从数据库生成了一个模型。数据库与这些类的结构几乎完全相同。
此外,这里已经有很多代码。这些类还继承了几个接口等等。重构现在不是一个选项,所以我现在正在寻找一个简单的解决方案。

2
如果您确定它们的属性完全相同,您可以通过一些反射来实现。 - BlackBear
也许可以通过“反射”来实现,但是为什么要有如此相似的类结构呢? - King King
为什么你的Person对象不持有对PersonData的引用呢?也就是组合(假设这是你的用例)。 - Jeroen Vannevel
1
@Quoter 你需要在运行时创建一个模型定义。我认为主要的方法是“Fluent API”。教程在这里:属性和类型关系。你也可以通过在现有类上使用注释来实现其中的一些功能。(话虽如此,流畅的API应该能够做到注释所能做到的一切,甚至更多。这还可以让你映射无法修改的类。) - millimoose
目前的项目对于Code First方法来说过于复杂了。使用Fluent API和数据注释似乎可以解决这个问题。但是感谢您的建议,下次我会说明我最终想要实现什么,再向大家提问:p - Quoter
显示剩余4条评论
3个回答

9
假设您不希望两个类都继承自一个接口,则可以尝试使用Automapper。这是一个用于自动映射类间相似属性的库。

5

如果您是这些类的作者,您可以让它们实现相同的接口,甚至更好的方法是继承自同一类。这样,您就不必将值从一个复制到另一个 - 只需使用对其父类型的引用即可。请记住,具有完全相同成员的不相关类型的组合是需要尽快重新考虑设计的明确迹象。


IConvertible 用于转换原生类型,而非对象。 - Jouni Aro
@Jouni 呜呜...感谢您让我注意到那一点。 - Geeky Guy

2

为了完整起见,这是使用反射的样子:

var a = new Person( ) { LastName = "lastn", Name = "name", Address = "addr", ETC = "etc" };
var b = new PersonData( );

var infoPerson = typeof( PersonData ).GetProperties( );
foreach ( PropertyInfo pi in typeof( Person ).GetProperties( ) ) {
    object value = pi.GetValue( a, null );
    infoPerson.Single( p => p.Name == pi.Name )
        .SetValue( b, value, null );
}

@Quoter:它有多慢取决于您对“慢”的定义。如果您需要每秒处理数千个,那么您可能会认为它很慢。如果您每天只需要处理数千个,那么您就不会觉得它慢了。 - Gabe
@Quoter 我不是很确定...我会尽快进行基准测试并在这里发布结果。 - BlackBear
传入的数据相当庞大。但我也会尝试这种方法,看看它的效果如何,+1 谢谢! - Quoter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接