递归的对象属性值比较

setdefault 2007-04-29 11:18:49
//方法代码如下:
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;
}

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

*/
...全文
316 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
setdefault 2007-04-29
  • 打赏
  • 举报
回复
zswang(伴水清清)(专家门诊清洁工) 谢谢,
就像您举的例子这样,如果类中有递归的情况,"把比较过的类型记录下来,比较的时候判断一下比较过没",就有可能不对了
setdefault 2007-04-29
  • 打赏
  • 举报
回复
hbxtlhx(平民百姓) ( ) 您说的对,
但不能肯定是否所有的对象都重写过Equals()
北京的雾霾天 2007-04-29
  • 打赏
  • 举报
回复
你为什么不重写对象的Equals方法来实现对象的比较呢!
王集鹄 2007-04-29
  • 打赏
  • 举报
回复
class Node
{
Node Parent { get... }
}

这不就递归了

把比较过的类型记录下来,比较的时候判断一下比较过没
yunxiao_2004 2007-04-29
  • 打赏
  • 举报
回复
你这样实现递归没意义吧?把你想实现的功能说一下
setdefault 2007-04-29
  • 打赏
  • 举报
回复
还是问题颇多。
setdefault 2007-04-29
  • 打赏
  • 举报
回复
hbxtlhx(平民百姓),再给看看!
setdefault 2007-04-29
  • 打赏
  • 举报
回复
zswang(伴水清清)(专家门诊清洁工) ,谢谢您,费心帮助
这在有一个string类型的Property时会出错。
还有object的派生类,在执行object.Equals需要重写Equals才能进行值比较吧!
还是感谢!

我的新方法,几个简单的例子实验通过,效率低,可能还有未知bug,贴出来给看一下。
public bool PropertyEquals(object o1, object o2)
{
Type type1 = o1.GetType(), type2 = o2.GetType();
if(!type1.Equals(type2)) return false;

if(o1 is ValueType || o1 is Enum||o2 is string)
{
try
{
return Equals(o1, o2);
}catch
{
return false;
}
}

if (o1 is Array)
{
Array a1 = (Array) o1;
Array a2 = (Array) o2;

if(a1.Length!=a2.Length) return false;

for(int i=0; i<a1.Length; i++)
{
if(!PropertyEquals(a1.GetValue(i),a2.GetValue(i))) return false;
}
return true;
}

//其他情况
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;
}
北京的雾霾天 2007-04-29
  • 打赏
  • 举报
回复
如果只是来比较任意两个对象,问题可能真的比较麻烦,没有好的办法.
王集鹄 2007-04-29
  • 打赏
  • 举报
回复
//不递归行吗,接分过五一

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;
}
setdefault 2007-04-29
  • 打赏
  • 举报
回复
phommy(石头,竹子,诗),谢谢您。

但string类型就不是值类型,还会有错。

看来我的设计想法有点不妥!

等到4点半,看看还有更好的办法没有。
setdefault 2007-04-29
  • 打赏
  • 举报
回复
因为有些对象类不是我实现的,Equals()可能是比较引用相同,这种情况下比较的结果不可靠。
hbxtlhx(平民百姓) 能找个处理办法吧。谢谢
phommy 2007-04-29
  • 打赏
  • 举报
回复
如何判断值类型?
判断 obj is ValueType
北京的雾霾天 2007-04-29
  • 打赏
  • 举报
回复
但不能肯定是否所有的对象都重写过Equals()
--------------
确实是不能肯定,但是,如果对像要用来比较,最好还是要保证比较的对象都有自己的去处规则,Equals这方法就是干这个用的嘛.

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧