当用户更改他们的电子邮件、帐单地址等时,我正在处理的项目需要一些简单的审计日志记录。我们正在使用的对象来自不同的来源,一个是 WCF 服务,另一个是 Web 服务。
我使用反射实现了以下方法来查找两个不同对象的属性的更改。这会生成具有差异的属性及其旧值和新值的列表。
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 方法。