比较来自同一类的对象

本文关键字:一类 对象 比较 | 更新日期: 2023-09-27 18:11:32

我有以下类,我有两个对象,Obj1一个有以前的数据,obj2有一些可以改变的字段的数据(我在编辑的行动中,在改变之前有Obj1,之后有obj2)。我的问题是,如果我有两个对象,最好的方法是把对象(如键值列表),只是字段被改变,他们的值。我在SO中读到它,我发现了这两种方法,但有些帖子是旧的…什么是正确的/有效的方法去做?例子会很有帮助。

比较对象

获取同一对象中已更改的属性

  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";
        }
 }

我已经尝试过从这篇文章,但我得到了错误,任何想法?比较两个对象,找出差异

changedList = obj1.DetailedCompare(obj2);

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

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

比较来自同一类的对象

您必须创建一个函数,其中列出并比较两个对象的所有属性。这可以通过反射来实现:

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;
        }
    }
}

我使用"Equals方法"来比较字符串、int等的值,而不是它们的引用,这与"=="相反(这里比较的是引用,因为我们得到的是对象类型)。

        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比较两个对象的引用。