情况如下
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)
。我知道有几个问题已经提出了这个问题,但我正在寻找那条特别糟糕的问题。
谢谢!
答案 0 :(得分:3)
由于您的房产在其制定者中没有任何逻辑,因此不清楚为什么要比较旧价值与新价值之间的关系;最后,您的代码逻辑将确保b中的属性值始终是设置的。
换句话说,这将实现相同的目标:
a.Prop1 = b.Prop1;
答案 1 :(得分:1)
没有复制和粘贴,这可能只能通过反射来实现。
答案 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
设置为A
(B
)...
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中的属性就是所选的属性。