我使用反射实现了以下方法,以查找两个不同对象上属性的更改。这将生成具有差异的属性列表以及它们的旧值和新值。
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和Double)都实现了IComparable,String、Char和DateTime也是如此。”这似乎是找到任何不是自定义类的属性的最佳方法。
尝试利用由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 方法。
Equals
方法?我使用的代码与此非常相似,从来没有出现过错误的负值。 - Aaronaughtstring newText = (newText != null) ?
改为string newText = (newValue != null) ?
,因为前者会导致编译错误。 - gooleem