6

私は2つの同様のクラスを持っていますPerson:PersonDto

public class Person 
{
    public string Name { get; set; }
    public long Serial { get; set; }
    public DateTime Date1 { get; set; }
    public DateTime? Date2 { get; set; }
}

&

public class PersonDto
{
    public string Name { get; set; }
    public long Serial { get; set; }
    public DateTime Date1 { get; set; }
    public DateTime? Date2 { get; set; }
}

私は等しい値で両方の2つのオブジェクトを持っています。

    var person = new Person { Name = null , Serial = 123, Date1 = DateTime.Now.Date, Date2 = DateTime.Now.Date };
    var dto = new PersonDto { Name = "AAA", Serial = 123, Date1 = DateTime.Now.Date, Date2 = DateTime.Now.Date };

リフレクションによって 2 つのクラスのすべてのプロパティの値を確認する必要があります。私の最終的な目標は、このプロパティの差分値を定義することです。

    IList diffProperties = new ArrayList();
    foreach (var item in person.GetType().GetProperties())
    {
        if (item.GetValue(person, null) != dto.GetType().GetProperty(item.Name).GetValue(dto, null))
            diffProperties.Add(item);
    }

私はこれをしましたが、結果は満足のいくものではありません。diffProperties結果のカウントは でした4が、予想のカウントは でした1

もちろん、すべてのプロパティは null 値を持つことができます。

一般的なソリューションが必要です。私は何をしなければなりませんか?

4

4 に答える 4

12

リフレクションによる比較に固執したい場合は、!= (GetProperty 呼び出しのボックス化された結果のほとんどの比較に失敗する参照の等価性) を使用しないでください。代わりに、静的な Object.Equals メソッドを使用してください。

Equals メソッドを使用して、リフレクション コードで 2 つのオブジェクトを比較する方法のサンプル。

 if (!Object.Equals(
     item.GetValue(person, null),
     dto.GetType().GetProperty(item.Name).GetValue(dto, null)))
 { 
   diffProperties.Add(item);
 } 
于 2012-08-22T06:14:42.593 に答える
1

PersonクラスにIComparableインターフェイスを実装させ、メソッドを実装することを検討してくださいCompareTo(Object obj)

于 2012-08-22T06:25:11.930 に答える
0

IEquatableインターフェースを実装する

于 2012-08-22T06:25:59.743 に答える
-1

クラスを見ると、すべての値がnullになるわけではなく、null許容のlongがあります。しかし、それは言った。

私もこういうものを作って、このサイトを利用しました。2つの異なるオブジェクトを受け入れることができるようにするだけです。ライセンスが原因でコードを共有できません。

于 2012-08-22T06:26:16.820 に答える