我正在处理的项目需要一些简单的审核日志记录,以便用户更改其电子邮件地址,帐单地址等。我们正在处理的对象来自不同的来源,一个WCF服务,另一个Web服务。查找两个C#对象之间的属性差异
我已经实现了以下使用反射的方法来查找对两个不同对象的属性所做的更改。这会生成与旧值和新值有差异的属性列表。
public static IList GenerateAuditLogMessages(T originalObject, T changedObject)
{
IList list = new List();
string className = string.Concat("[", originalObject.GetType().Name, "] ");
foreach (PropertyInfo property in originalObject.GetType().GetProperties())
{
Type comparable =
property.PropertyType.GetInterface("System.IComparable");
if (comparable != null)
{
string originalPropertyValue =
property.GetValue(originalObject, null) as string;
string newPropertyValue =
property.GetValue(changedObject, null) as string;
if (originalPropertyValue != newPropertyValue)
{
list.Add(string.Concat(className, property.Name,
" changed from '", originalPropertyValue,
"' to '", newPropertyValue, "'"));
}
}
}
return list;
}
我在寻找System.IComparable,因为“所有的数字类型(如的Int32和双人间)实现IComparable,因为这样做字符串,字符和日期时间。”这似乎是找到任何不属于自定义类的财产的最佳方式。
攻击由WCF或Web服务代理代码生成的PropertyChanged事件听起来不错,但没有为我的审计日志(旧值和新值)提供足够的信息。
寻找关于是否有更好的方式来做到这一点的意见,谢谢!
@Aaronaught,这里是基于这样做的Object.Equals产生正匹配一些示例代码:
Address address1 = new Address();
address1.StateProvince = new StateProvince();
Address address2 = new Address();
address2.StateProvince = new StateProvince();
IList list = Utility.GenerateAuditLogMessages(address1, address2);
“[地址] StateProvince从 'MyAccountService.StateProvince' 改为 ' MyAccountService.StateProvince'“
它是StateProvince类的两个不同实例,但属性的值是相同的(在这种情况下全为null)。我们并不是重写equals方法。
遗憾的是只使用的Object.Equals正在恢复为引用类型真实的,例如: [联系地址] StateProvince从“MyAccountService.StateProvince”到“MyAccountService.StateProvince” – 2010-03-05 19:14:03
@Pete尼尔森改变:假设你实际上比较不同的参考文献,那是......不可能的。我们能否在课堂上看到一个完整的例子?它是否重写'Equals'方法?我使用的代码非常类似于此,它从不给出错误的否定。 – Aaronaught 2010-03-05 19:19:42
为原始帖子添加了匹配的示例。 – 2010-03-05 19:44:41