在C#中合并两个对象

fre*_*hie 33 .net c#

我有一个具有各种属性的对象模型MyObject.有一次,我有两个这样的MyObject实例:实例A和实例B.如果实例B具有非空值,我想将实例A中的属性与实例B的属性进行复制和替换.

如果我只有1个具有3个属性的类,没问题,我可以轻松地对其进行硬编码(这是我开始做的).但实际上我有12个不同的对象模型,每个模型大约有10个属性.

有什么好办法呢?

Bas*_*Bas 43

更新如果需要大量调用此方法, 请改用AutoMapper.Automapper使用构建动态方法,Reflection.Emit并且比反射快得多.

您可以使用反射复制属性的值:

public void CopyValues<T>(T target, T source)
{
    Type t = typeof(T);

    var properties = t.GetProperties().Where(prop => prop.CanRead && prop.CanWrite);

    foreach (var prop in properties)
    {
        var value = prop.GetValue(source, null);
        if (value != null)
             prop.SetValue(target, value, null);
    }
}
Run Code Online (Sandbox Code Playgroud)

我把它做成通用的,以确保类型安全.如果要包含私有属性,则应使用Type.GetProperties()的重写,指定绑定标志.


Nav*_*jay 8

我已经尝试过Kyle Finley将两个对象合并为一个匿名类型,它的工作非常完美.

TypeMerger合并一样简单

var obj1 = new {foo = "foo"};

var obj2 = new {bar = "bar"};

var mergedObject = TypeMerger.MergeTypes(obj1 , obj2 );
Run Code Online (Sandbox Code Playgroud)

这就是你得到了合并的对象,除此之外,还有一个规定可以忽略特定的属性.你也可以对MVC3使用相同的东西.