读书人

递归的对象属性值比较,该如何处理

发布时间: 2012-02-19 19:43:39 作者: rapoo

递归的对象属性值比较
//方法代码如下:
public static bool PropertyEquals(object o1, object o2)
{
PropertyInfo []pInfos1 = o1.GetType().GetProperties();
PropertyInfo[] pInfos2 = o2.GetType().GetProperties();

if(!pInfos1.Length.Equals(pInfos2.Length))
{
return false;
}

for(int i=0; i <pInfos2.Length;i++)
{
if (!PropertyEquals(pInfos2[i].GetValue(o2, null), pInfos1[i].GetValue(o1, null))) return false;
}
return true;
}

/*
问题是这样递归的比较在遇到值类型时是不需要的。如何判断值类型?
现在还会进入死循环,加什么样的出口条件?请高手帮忙解决或提示一下。

*/

[解决办法]
你为什么不重写对象的Equals方法来实现对象的比较呢!
[解决办法]
如何判断值类型?
判断 obj is ValueType

[解决办法]
//不递归行吗,接分过五一

public static bool PropertyEquals(object AObject1, object AObject2)
{

if (object.ReferenceEquals(AObject1, AObject2)) return true; // 相同实例
if (object.Equals(AObject1, AObject2)) return true; // 相同值
if (AObject1 == null || AObject2 == null) return false; // 其中有空

PropertyInfo[] vPropertyInfos1 = AObject1.GetType().GetProperties();
PropertyInfo[] vPropertyInfos2 = AObject2.GetType().GetProperties();

if (vPropertyInfos1.Length != vPropertyInfos2.Length) return false;

for (int i = 0; i < vPropertyInfos1.Length; i++)
{
if (vPropertyInfos1[i].GetType() != // 类型不相同
vPropertyInfos2[i].GetType()) return false;

object vObject1 = vPropertyInfos1[i].GetValue(AObject1, null);
object vObject2 = vPropertyInfos2[i].GetValue(AObject2, null);
if (!(object.ReferenceEquals(vObject1, vObject2) ||
object.Equals(vObject1, vObject2))) return false;
}
return true;
}

[解决办法]
如果只是来比较任意两个对象,问题可能真的比较麻烦,没有好的办法.

读书人网 >C#

热点推荐