比较来自同一个类的对象

时间:2014-07-06 07:59:27

标签: c# asp.net .net linq

我有以下类,我有两个对象,Obj1一个有前面的数据,obj2有一些可以改变的字段的数据(我在编辑的行为中,在更改之前有obj1和obj2之后)。我的问题是,如果我有两个对象,最好的方法是放入对象(如关键值列表),只是改变的字段和它们的值。 我在SO中读到了它,我找到了这两种方法,但是有些帖子很旧...... 什么是正确/有效的方式?示例将非常有用。

Comparing objects

Get the changed properties in same object

  public class UserData
    {
        public int Id { get; set; }
        public string UserName { get; set; }
        public string Address { get; set; }
        public string Email { get; set; }
        public string Work { get; set; }
        public string Home { get; set; }
    }

public class Program
{   
   public static void Main()
   {


    UserData obj1 = new UserData();

    obj1.Email = "www.test.com";

    obj1.Home = "test home";
    UserData obj2 = new UserData();

    obj2.Email = "www.test2.com";
    obj2.Home = "test home2";

        }

 }

我在这篇文章中尝试了以下内容,但我收到了错误,有什么想法吗? Compare two objects and find the differences

changedList = obj1.DetailedCompare(obj2);

我收到了这个错误,知道如何解决它:

  

方法的类型参数   'Web.Controllers.extentions.DetailedCompare<T>(T, T)'不能   从用法推断。尝试明确指定类型参数

1 个答案:

答案 0 :(得分:2)

您必须创建列出并比较两个对象的所有属性的函数。这可以通过反思来完成:

public class UserData
{
    public int Id { get; set; }
    public string UserName { get; set; }
    public string Address { get; set; }
    public string Email { get; set; }
    public string Work { get; set; }
    public string Home { get; set; }

    public IEnumerable<PropertyInfo> GetVariance(UserData user)
    {
        foreach (PropertyInfo pi in user.GetType().GetProperties()) {

            object valueUser = typeof(UserData).GetProperty (pi.Name).GetValue (user);
            object valueThis = typeof(UserData).GetProperty (pi.Name).GetValue (this);

            if (valueUser != null && !valueUser.Equals(valueThis))
                yield return pi;

        }
    }

}

我使用&#34; Equals方法&#34;比较字符串,int等的值,而不是它们的引用,而不是&#34; ==&#34; (这里比较引用,因为我们得到一个对象类型)。

        UserData obj1 = new UserData();

        obj1.Email = "www.test.com";
        obj1.Home = "test home";
        UserData obj2 = new UserData();

        obj2.Email = "www.test2.com";
        obj2.Home = "test home2";

        IEnumerable<PropertyInfo> variances = obj1.GetVariance (obj2);

        foreach (PropertyInfo pi in variances)
            Console.WriteLine (pi.Name);

注意,它只适用于原始类型(int,string,float,...),因为Equals会比较两个对象的引用。