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

C# 有更好的方法吗?(比较/合并两个对象上的特定属性),c#,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.Pro

情况是这样的

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中,这只需
$。扩展(a,b)
。我知道有几个问题问过这个问题,但我在寻找那句特别糟糕的台词


谢谢

由于您的属性在其设置器中没有任何逻辑,因此不清楚为什么比较新旧价值很重要;最后,代码的逻辑将确保b中的属性值始终是设置的

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

a.Prop1 = b.Prop1;

由于您的属性在其设置器中没有任何逻辑,因此不清楚为什么比较新旧值很重要;最后,代码的逻辑将确保b中的属性值始终是设置的

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

a.Prop1 = b.Prop1;

如果你在逻辑上考虑这一秒:

a.Prop1 = a.Prop1 != b.Prop1 : b.Prop1 ? a.Prop1;
只有当b的Prop1不同时,才会更改Prop1

所以本质上,最终你还是得到了b.Prop1的值


所以,你可以只做
a.Prop1=b.Prop1 

如果你在逻辑上考虑一秒钟:

a.Prop1 = a.Prop1 != b.Prop1 : b.Prop1 ? a.Prop1;
只有当b的Prop1不同时,才会更改Prop1

所以本质上,最终你还是得到了b.Prop1的值


所以,你可以只做
a.Prop1=b.Prop1

您可以编写一个方法来实现这一点,该方法反映在A上,找到每个具有getter和setter的属性,然后在B上找到相同的属性,如果B不为null,并且A中的属性不等于B中的属性,则将值设置为Bs value

编辑

由于您只需将
A
的属性设置为
B
s,因此您只需执行此操作即可避免手动执行此操作:

正如Blanterly抄袭的,但已更新为适用于每个酒店:

   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;
    }
public static tenty CopyTo(此tenty OriginalEntity,tenty NewEntity)
{
PropertyInfo[]oProperties=OriginalEntity.GetType().GetProperties();
foreach(PropertyInfo-CurrentProperty in-oProperties.Where(p=>p.CanWrite))
{
CurrentProperty.SetValue(OriginalEntity,newEntityValue,null);
}
回归本源性;
}

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

您可以编写一个方法来实现这一点,该方法反映在A上,找到每个具有getter和setter的属性,然后在B上找到相同的属性,如果B不为null且A中的属性不等于B中的属性,则将该值设置为Bs value

编辑

由于您只需将
A
的属性设置为
B
s,因此您只需执行此操作即可避免手动执行此操作:

正如Blanterly抄袭的,但已更新为适用于每个酒店:

   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;
    }
public static tenty CopyTo(此tenty OriginalEntity,tenty NewEntity)
{
PropertyInfo[]oProperties=OriginalEntity.GetType().GetProperties();
foreach(PropertyInfo-CurrentProperty in-oProperties.Where(p=>p.CanWrite))
{
CurrentProperty.SetValue(OriginalEntity,newEntityValue,null);
}
回归本源性;
}
沿着这些思路的扩展方法应该对您有所帮助

你的逻辑很糟糕。 所以如果
A
等于
B
。。。 然后将
A
设置为
A
(即
B
)。。。 否则设置为
B

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

因此
a.Prop1=b.Prop1
。都是一样的。

你的逻辑很糟糕。 所以如果
A
等于
B
。。。 然后将
A
设置为
A
(即
B
)。。。 否则设置为
B

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


因此
a.Prop1=b.Prop1
。是一样的。

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

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

如果要复制和粘贴,只需在调用的combine中创建一个类级方法,该方法返回一个新实例

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

我不确定我是否正确理解了该问题,但您可能可以使用空合并运算符:

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中的属性。

我不确定是否正确理解此问题,但您可能可以使用null合并运算符:

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中的属性就是选择的属性。

我假设您只将
a
的属性设置为
B
的属性是
B
的属性实际上有一个值,所以你永远不会用null覆盖一个值…@Sam Holder如果我想这样做,我可能会使用??我假设你只将
a
的属性设置为
B
的属性是
B
实际上有一个值,因此,您永远不会使用null覆盖值…@Sam Holder如果我想这样做,我可能会使用??这确实有助于对许多属性执行此操作,尽管问题中不清楚他是否可能不想使用null值(或默认值?)覆盖现有值这确实有助于对许多属性执行此操作,尽管问题中不清楚,但他可能不想使用空值(或默认值?)覆盖现有值