同一个类,两个不同的实体,内存空间不一样。
我想比较两个实体的Field值是否相等。
不能用obj1。id==obj2。id,我是循环比较,不知道类的属性和类型。

解决方案 »

  1.   

    不是,我是用反射,想比较PropertyInfo 值是否相等。
    因此,我就不知道他的类型是什么。
      

  2.   

    或者,专门写一个 PropertyInfo  值相等的方法,不过,不想呀,循环下来,效率呀。
      

  3.   

    反射获取PropertyInfo 
    PropertyInfo[] properties = t.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
     foreach (PropertyInfo item in properties)
    {
        string name = item.Name;
        object value = item.GetValue(t, null);
        Console.WriteLine("{0}:{1}", name,value);
     }
      

  4.   

    在obj1里重载个equals来处理就是了,如:public class obj2
    {
        public int Id1;
        public int Id2;
        public int Id3;
        public int Id4;
    }
    public class obj1
    {
        public int Id1;
        public int Id2;
        public int Id3;
        public int Id4;    public bool Equals(obj2 obj)
        {
            return this.Id1.Equals(obj.Id1) &&
                this.Id2.Equals(obj.Id2) &&
                this.Id3.Equals(obj.Id3) &&
                this.Id4.Equals(obj.Id4);
        }
    }如果对比的不是一个类,而是多个,可以作成接口,然后再Equals(interface obj)就是了。不要作太多不可知的设计,反射是很好用,但是是有代价的。
      

  5.   

     public string Compare(object1 a, object1 b)
            {
                StringBuilder resultStr = new StringBuilder();
                if (a.GetType() == b.GetType() && !a.Equals(b))
                {
                    PropertyInfo[] properties = typeof(object1).GetProperties();
                    for (int i = 0; i < properties.Length; i++)
                    {
                        if (!properties[i].GetValue(a, null).Equals(properties[i].GetValue(b, null)))
                        {
                            resultStr.Append(string.Concat(properties[i].Name, ":"));
                            resultStr.Append(properties[i].GetValue(a, null));
                            resultStr.Append(" ");
                            resultStr.Append(properties[i].GetValue(b, null));
                            resultStr.Append("<br />");
                        }
                    }
                }
                return resultStr.ToString();
            }
        }