[英]using reflection to compare object in list
我有一个“发票” WinForm C#,其中包含常用的文本框和未绑定的datagridview。 我使用了“发票”类对象来存储表单字段的值。 datagridview行存储到“发票”中的List <SubInvoice>属性。
public static bool CompareObjects(object original, object altered)
{
Type o = original.GetType();
Type a = altered.GetType();
foreach (PropertyInfo p in o.GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
Console.WriteLine("Original: {0} = {1}", p.Name, p.GetValue(original, null));
Console.WriteLine("Altered: {0} = {1}", p.Name, p.GetValue(altered, null));
if (p.GetValue(original, null).ToString() != p.GetValue(altered, null).ToString())
{
//Console.WriteLine("Not Equal");
return false;
}
}
return true;
}
我正在使用一个全局类,其方法使用反射来遍历原始“发票”对象,并将其与更改后的“发票”进行比较。 如果有任何差异,将通知用户保存发票。
上面的方法在'Invoice'类的所有属性下都可以正常工作,但是我不知道如何检查将每个数据网格的值存储在其中的'SubInvoice'类对象中的List,该对象将其存储为列表中的对象。
有人可以在这里给我一些帮助吗? 我也检查了stackoverflow和其他论坛中的类似线程,但是徒劳。
更新:我需要创建一个全局通用方法,该方法将检查所有类型的类。 可以是“发票”,“客户”。 目的是跟踪在任何特定实例对表单所做的任何更改,并提示用户进行保存。
如果您只是想通知用户保存待处理的更改,则应该实现INotifyPropertyChanged而不是做一些不可思议的事情。
我之前见过的一个技巧是将对象标记为可序列化,然后将它们序列化为字符串并比较字符串。 它可能不是最有效的方法,但是它是快速,容易的,并且适用于几乎所有类型的数据类。 它甚至适用于引用了其他类的“复杂”嵌套类。
缺点是它不会轻易告诉您具体更改了什么,只是有所不同。
谢谢大家的帮助。
我偶然接触了以下文章,但仍然渴望通过反射创建一个全局通用方法。
http://www.c-sharpcorner.com/UploadFile/1a81c5/custom-extension-method-to-compare-list-in-C-Sharp/
如果有人感兴趣,这是代码。
public static bool CompareObjects(object original, object altered)
{
bool result = true;
//Get the class
Type o = original.GetType();
Type a = altered.GetType();
//Cycle through the properties.
foreach (PropertyInfo p in o.GetProperties(BindingFlags.Public | BindingFlags.Instance))
{
Console.WriteLine("Original: {0} = {1}", p.Name, p.GetValue(original, null));
Console.WriteLine("Altered: {0} = {1}", p.Name, p.GetValue(altered, null));
if (!p.PropertyType.IsGenericType)
{
if (p.GetValue(original, null) != null && p.GetValue(altered, null) != null)
{
if (!p.GetValue(original, null).ToString().Equals(p.GetValue(altered, null).ToString()))
{
result = false;
break;
}
}
else
{
//If one is null, the other is not
if ((p.GetValue(original, null) == null && p.GetValue(altered, null) != null) || (p.GetValue(original, null) != null && p.GetValue(altered, null) == null))
{
result = false;
break;
}
}
}
}
return result;
}
public static bool CompareLists<T>(this List<T> original, List<T> altered)
{
bool result = true;
if (original.Count != altered.Count)
{
return false;
}
else
{
if (original != null && altered != null)
{
foreach (T item in original)
{
T object1 = item;
T object2 = altered.ElementAt(original.IndexOf(item));
Type objectType = typeof(T);
if ((object1 == null && object2 != null) || (object1 != null && object2 == null))
{
result = false;
break;
}
if (!CompareObjects(object1, object2))
{
result = false;
break;
}
}
}
else
{
if ((original == null && altered != null) || (original != null && altered == null))
{
return false;
}
}
}
return result;
}
用法: if(!xx.CompareObjects(searchedInvoice,alteredInvoice)|!xx.CompareLists(searchedInvoice.SubInvoice,alteredInvoice.SubInvoice))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.