我认为我想做的事是不可能的。 但是,我想确保这确实是不可能的。
我使用Audit.Net作为框架将审核添加到已经完成的系统中。 可以发送许多不同的对象进行审核。我必须掌握这些对象的属性并将其发送到数据库。在某些情况下,我需要旧值和新值,因此我使用AuditEvent的Target属性,否则,如果我只需要新值,则使用CustomField属性。
有什么方法可以使以下内容更加通用,从而不必为SimpleResult
,LeaveRequest
,Incident
等每种类型的对象重复这些行?
不幸的是,被审核的对象之间没有共同点。
SimpleResult objOld = JsonConvert.DeserializeObject<SimpleResult>(auditEvent.Target.SerializedOld.ToString());
SimpleResult objNew = JsonConvert.DeserializeObject<SimpleResult>(auditEvent.Target.SerializedNew.ToString());
if (auditEvent.Target.Type.ToString() == "SimpleResult")
{
InsertTargetObjectFields<SimpleResult>(objOld, objNew, auditControlTableID, auditEvent);
}
在这里,我可以获取属性并将其发送到数据库:
public void InsertTargetObjectFields<T>(T objOld, T objNew, int? auditControlTableID, AuditEvent auditEvent)
{
using (ESSDataContext ess_context = new ESSDataContext())
{
try
{
foreach (var property in objOld.GetType().GetProperties().Where(property => !property.GetGetMethod().GetParameters().Any()))
{
//Check for null values and get hold of oldValue and newValue
var sqlResult = ess_context.InsertAuditTable(resourceTag, dbObjectName, username, property.Name, oldValue,
newValue, auditEvent.StartDate, auditControlTableID.ToString(),
auditEvent.Environment.CallingMethodName);
}
}
}
}
我尝试使用dynamic
,但是后来我没有正确获得属性。