我有一个有很多属性的类。浅拷贝足以完全复制对象。简单地在c中比较两个对象的属性#
我需要比较一个对象只是为了检查它是否包含与另一个完全相同的值。
我的想法:
第一个也是最明显的解决方案就是创建每个属性,一个接一个比较庞大的方法块。
第二,将序列化每个对象和散列文件或做一些对它的md5校验和。 (这实际上工作)。
第三种是对物体进行某种反射,这会使第一种选择自动化,但是会增加复杂性。
速度并不是真正的问题。
有兴趣听到思想或任何其他方法我失踪做这样的事情。
编辑: 谢谢大家。我的解决方案:(修改为现在是递归通用项目)。
public static bool IsSame<T>(T objA, T objB)
{
var type = typeof(T);
var properties = type.GetProperties();
foreach (var pi in properties.Where(a => a.CanRead))
{
if (pi.Name == "Item")
{
var piCount = properties.FirstOrDefault(a => a.Name == "Count");
int count = -1;
if (piCount != null && piCount.PropertyType == typeof(System.Int32))
count = (int)piCount.GetValue(objA, null);
if (count > 0)
{
for (int i = 0; i < count; i++)
{
dynamic child1 = pi.GetValue(objA, new object[] { i });
dynamic child2 = pi.GetValue(objB, new object[] { i });
return IsSame(child1, child2);
}
}
}
else
{
var val1 = type.GetProperty(pi.Name).GetValue(objA, null);
var val2 = type.GetProperty(pi.Name).GetValue(objB, null);
if (val1 != val2 && (val1 == null || !val1.Equals(val2)))
return false;
}
}
return true;
}
我会去反思,除非类结构不容易改变。如果它*不会*改变,我会选择第一个解决方案,而不是(易于阅读,易于维护) – Alex
http://stackoverflow.com/questions/506096/comparing-object-properties-in-c-sharp有用反射解决方案。 – Giedrius