【问题标题】:compare objects from the same class比较同一类的对象
【发布时间】:2014-07-06 07:59:26
【问题描述】:

我有以下类,我有两个对象,Obj1 一个有以前的数据,obj2 有一些可以更改的字段的数据(我正在编辑,在更改之前有 obj1,之后有 obj2) .我的问题是,如果我有两个对象,那么将对象(如键 val 列表)仅放入已更改的字段和它们的值的最佳方法是什么。 我在 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)' 不能 从用法推断。尝试明确指定类型参数

【问题讨论】:

  • @PatrickHofman-不确定我明白了...
  • obj1-email = "www.test.com"; 是什么意思?
  • @KonradKokosa-这只是从上一个更改的对象属性的示例...修复我的帖子并将第二个更改为 obj2...
  • @PatrickHofman- 不编译是什么意思?在我的示例中有 6 个属性,其中只有两个(家庭、电子邮件)发生了变化,我想得到它们,如何?我尝试使用底部的示例而没有任何想法?
  • 表示您访问properties 的方式在语法上不正确。正确的方法是使用. 而不是-。喜欢:obj2.email 不是obj2-email

标签: c# asp.net .net linq


【解决方案1】:

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

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

【讨论】:

  • 非常感谢投票!,最后一个问题,我所有的属性都是位于另一个对象内的两个属性旁边的字符串,我应该如何通过反射获得它们?
  • 如果这些属性的类型是您定义的类,您可以覆盖“Equals”或查看此链接Compare two complex object,否则会更复杂...不幸的是我不知道是什么是最好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-19
  • 2015-07-26
  • 2014-01-12
  • 1970-01-01
相关资源
最近更新 更多