比较来自同一类的对象
本文关键字:一类 对象 比较 | 更新日期: 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比较两个对象的引用。