我创建了此Update方法
public void Update(Person updated)
{
var oldProperties = GetType().GetProperties();
var newProperties = updated.GetType().GetProperties();
for (var i = 0; i < oldProperties.Length; i++)
{
var oldval = oldProperties[i].GetValue(this, null);
var newval = newProperties[i].GetValue(updated, null);
if (oldval != newval)
oldProperties[i].SetValue(this, newval, null);
}
}
它的作用是比较两个Person对象以及是否有任何新值。它会更新原始对象。这很好用,但作为一个懒惰的程序员,我希望它更可重用。
我希望它能像这样工作。
Person p1 = new Person(){Name = "John"};
Person p2 = new Person(){Name = "Johnny"};
p1.Update(p2);
p1.Name => "Johnny"
Car c1 = new Car(){Brand = "Peugeot"};
Car c2 = new Car(){Brand = "BMW"};
c1.Update(c2);
c1.Brand => "BMW"
c1.Update(p1); //This should not be possible and result in an error.
我正在考虑使用和Abstract Class来保存Method然后使用一些Generic,但我不知道如何使它特定于Class。
答案 0 :(得分:3)
public static void Update(object original, object updated)
{
var oldProperties = original.GetType().GetProperties();
var newProperties = updated.GetType().GetProperties();
for (var i = 0; i < oldProperties.Length; i++)
{
var oldval = oldProperties[i].GetValue(original, null);
var newval = newProperties[i].GetValue(updated, null);
if (!Equals(oldval,newval))
oldProperties[i].SetValue(original, newval, null);
}
}
或者如果你想确保相同的类型:
public static void Update<T>(T original, T updated)
{
var properties = typeof(T).GetProperties();
for (var i = 0; i < properties.Length; i++)
{
var oldval = properties[i].GetValue(original, null);
var newval = properties[i].GetValue(updated, null);
if (!Equals(oldval,newval))
properties[i].SetValue(original, newval, null);
}
}
答案 1 :(得分:2)
您的代码有一点缺陷,如果您没有强制执行这两个对象实际上是完全相同的类型,它们可能没有相同的属性,您将面临错误。
像这样的通用方法几乎可以在任何事情上正确运行,只要它是class
(这就是约束where T: class
的含义:如果它不是你传递的类,代码不会编译)。
static void Update<T>(T original, T updated) where T : class
{
var Properties = typeof(T).GetProperties();
foreach (PropertyInfo property in Properties)
{
var oldval = property.GetValue(original, null);
var newval = property.GetValue(updated, null);
if (oldval != newval) property.SetValue(original, newval, null);
}
}
答案 2 :(得分:1)
尝试这种模式:
interface IUpdateable
{
void Update(IUpdateable updated)
}
public void Update<T>(T updated) where T:IUpdateable
{
...
...
}