6

我有两个类似的课程:PersonPersonDto

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; }
}

我有两个值相等的对象。

    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 };

我需要通过反射检查两个类中所有属性的值。我的最终目标是定义此属性的差异值。

    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

当然,所有属性都可以有空值。

我需要一个通用的解决方案。我必须做什么?

4

4 回答 4

12

如果您想坚持通过反射进行比较,则不应使用 != (引用相等,这将使 GetProperty 调用的装箱结果的大多数比较失败),而是使用静态 Object.Equals 方法

示例如何使用 Equals 方法比较反射代码中的两个对象。

 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

看看你的类,并不是所有的值都可以为空,你有一个可以为空的 long。但这就是说。

我也做了类似的东西并使用了这个网站。只需让它可以接受 2 个不同的对象。由于许可抱歉,我无法共享我的代码。

于 2012-08-22T06:26:16.820 回答