我有两个类似的课程: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; }
}
我有两个对象都是相同的值。
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
。
当然,所有属性都可以包含空值。
我需要一个通用的解决方案。 我该怎么办?
答案 0 :(得分:11)
如果你想坚持通过反射进行比较,你不应该使用!=(引用相等性,这将使GetProperty调用的盒装结果的大多数比较失败),而是使用static Object.Equals method。
演示如何使用Equals方法比较反射代码中的两个对象。
if (!Object.Equals(
item.GetValue(person, null),
dto.GetType().GetProperty(item.Name).GetValue(dto, null)))
{
diffProperties.Add(item);
}
答案 1 :(得分:1)
您可以考虑实现IComparable接口的Person类并实现CompareTo(Object obj)方法。
答案 2 :(得分:0)
答案 3 :(得分:-1)
看着你的类并不是所有的值都可以为null,你有一个可以为空的长。 但那说。
我也做了类似的事情并使用了this website。只需使它可以接受2个不同的对象。由于许可证,我无法分享我的代码。