我有以下类,我有两个对象,Obj1一个有前面的数据,obj2有一些可以改变的字段的数据(我在编辑的行为中,在更改之前有obj1和obj2之后)。我的问题是,如果我有两个对象,最好的方法是放入对象(如关键值列表),只是改变的字段和它们的值。 我在SO中读到了它,我找到了这两种方法,但是有些帖子很旧...... 什么是正确/有效的方式?示例将非常有用。
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)'
不能 从用法推断。尝试明确指定类型参数
答案 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会比较两个对象的引用。