日期:2014-05-19  浏览次数:20679 次

递归的对象属性值比较
//方法代码如下:
                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;
}

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