有一个更好的方法吗? (比较/合并两个对象的特定属性)

时间:2011-06-17 21:07:25

标签: c#

情况如下

public class A {
    public string Prop1 {get;set;}
    public int Prop2 {get;set;}
}

A a = new A(){ Prop1="A", Prop2 = 1}
A b = new A(){ Prop1="B"}

//Merge Two objects into a but only specific properties
a.Prop1 = a.Prop1 != b.Prop1 ? b.Prop1 : a.Prop1; //This part.

//a = {Prop1: "B", Prop2: 1}

有更好的方法吗?现在我有20个属性,我只是一遍又一遍地复制/粘贴这一行。在使用jQuery的Javascript中,这只是$.extend(a, b)。我知道有几个问题已经提出了这个问题,但我正在寻找那条特别糟糕的问题。

谢谢!

7 个答案:

答案 0 :(得分:3)

由于您的房产在其制定者中没有任何逻辑,因此不清楚为什么要比较旧价值与新价值之间的关系;最后,您的代码逻辑将确保b中的属性值始终是设置的。

换句话说,这将实现相同的目标:

a.Prop1 = b.Prop1;

答案 1 :(得分:1)

没有复制和粘贴,这可能只能通过反射来实现。

请参阅C# Reflection - merge two objects together

答案 2 :(得分:1)

如果您在逻辑上考虑这一点:

a.Prop1 = a.Prop1 != b.Prop1 : b.Prop1 ? a.Prop1;

只有当它的B的Prop1不同时才会更改Prop1。

基本上,最后你还是拥有b.Prop1的价值。

所以,你可以a.Prop1 = b.Prop1;

答案 3 :(得分:1)

你可以通过编写一个反映在A上的方法并找到每个具有getter和setter的属性,然后在B上找到相同的属性并将值设置为Bs值(如果B不为null)和属性在A中不等于B中的属性

修改

因为您要做的就是将A的属性设置为B,然后您可以这样做以避免手动执行此操作:

this answer肆无忌惮地抄袭,但为每件财产做了更新:​​

   public static TEntity CopyTo<TEntity>(this TEntity OriginalEntity, TEntity NewEntity)
    {
        PropertyInfo[] oProperties = OriginalEntity.GetType().GetProperties();

        foreach (PropertyInfo CurrentProperty in oProperties.Where(p => p.CanWrite))
        {
            CurrentProperty.SetValue(OriginalEntity, newEntityValue, null);
        }

        return OriginalEntity;
    }

沿着这些方向的扩展方法应该对您有所帮助。

答案 4 :(得分:1)

你的逻辑很臭。 因此,如果A等于B ... 然后将A设置为AB)... else设置为B

这与“将A设置为B”相同。

所以a.Prop1 = b.Prop1。是一回事。

答案 5 :(得分:0)

如果要复制和粘贴,可以在被调用的组合中创建一个类级别方法,返回一个新实例。

public A combine(A target)
{
return new A {Prop1 = target.Prop1, Prop2 = this.Prop2 };
}

答案 6 :(得分:0)

我不确定我是否正确理解了这个问题,但您可能会使用null-coalescing运算符:

public class A {
    public string Prop1 {get;set;}
    public int? Prop2 {get;set;}

    public static A Merge(A a, A b) {

        var res = new A();

        //res.Prop = b.Prop unless b.Prop is null, in which case res.Porp = a.Prop
        res.Prop1 = b.Prop1 ?? a.Prop1;
        res.Prop2 = b.Prop2 ?? a.Prop2;

        return res;
    }
}


var a = new A() {Prop1 = "A", Prop2 = 1};
var b = new A() {Prop1 = "B"};
var c = A.Merge(a,b);

这样,只有在B中设置的属性才会被复制到新类中,否则a中的属性就是所选的属性。