1

この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);
       }
   }

2つの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.

メソッドを保持するために抽象クラスを使用してからジェネリックを使用することを考えていましたが、クラス固有にする方法がわかりません。

4

3 に答える 3

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);
       }
   }
于 2012-08-01T10:21:01.527 に答える
2

コードには少し欠陥があります。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);
    }
}
于 2012-08-01T10:27:17.627 に答える
1

このパターンを試してください:

interface IUpdateable
{
void Update(IUpdateable updated)
}

public void Update<T>(T updated) where T:IUpdateable
{
...
...
}
于 2012-08-01T10:20:30.267 に答える