如何通过匹配字段或属性名称来复制来自不同类的数据

kei*_*en7 3 c# mvvm c#-4.0

我希望找到一种方法来获取具有相同属性的两个对象,并调用将属性值从一个对象复制到另一个对象.下面的例子假设我有一个A的实例,我想使用该实例的数据来水合一个新的实例或C(为了保持简洁,我在下面的例子中使用了字段而不是属性)

public class A : B
{
    public string prop1;
    public int prop2;
}

public class B
{
    public byte propX;
    public float propY;
}

public class C
{
    public byte propX;
    public float propY;
    public string prop1;
    public int prop2;
}

public class Merger
{
    public static object Merge(object copyFrom, object copyTo)
    { 
        //do some work
        //maybe <T> generically refactor?
    }
}
Run Code Online (Sandbox Code Playgroud)

合并类只是一个伪造的例子,通过泛型来做这个是最优的,但我首先要问的是这样的能力是否已经存在.我可以想象自己使用反射来做这件事,但只是想先把它扔出来以获得更好的想法.

真实世界上下文:这实际上是一个与MVVM相关的问题,因为我试图使用从EF回来的不同类来填充ViewModel实例.

mar*_*c_s 8

查看像AutoMapper这样的工具和库- 那些可以轻松处理这样的案例 - 以及更多!无需重新发明轮子 - 只需使用该工具!:-)

您基本上可以在A和C类之间定义一个映射,如下所示:

Mapper.CreateMap<A, C>();
Run Code Online (Sandbox Code Playgroud)

然后,你可以让AutoMapper根据该映射,从A的实例到C的实例进行映射,如下所示:

C yourC = Mapper.Map<A, C>(instanceOfA);
Run Code Online (Sandbox Code Playgroud)

AutoMapper根据属性名称(和类型)执行默认映射,但您可以通过多种方式扩展和影响它,以包括从一个属性到另一个属性的映射,即使名称(或类型)不匹配100%.这是非常灵活和完善的 - 绝对值得认真看看!