【发布时间】:2026-02-02 13:40:02
【问题描述】:
我正在处理的项目需要一些简单的审核日志记录,以便在用户更改电子邮件、帐单地址等时进行。我们正在使用的对象来自不同的来源,一个是 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);
"[Address] StateProvince 从 'MyAccountService.StateProvince' 到 'MyAccountService.StateProvince'"
它是 StateProvince 类的两个不同实例,但属性的值是相同的(在这种情况下都是 null)。我们没有覆盖 equals 方法。
【问题讨论】:
标签: c# .net reflection auditing