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值(或默认值?)覆盖现有值这确实有助于对许多属性执行此操作,尽管问题中不清楚,但他可能不想使用空值(或默认值?)覆盖现有值