是否可以使用更通用的解决方案?

时间:2019-09-10 09:45:23

标签: c# generics audit.net

我认为我想做的事是不可能的。 但是,我想确保这确实是不可能的。

我使用Audit.Net作为框架将审核添加到已经完成的系统中。 可以发送许多不同的对象进行审核。我必须掌握这些对象的属性并将其发送到数据库。在某些情况下,我需要旧值和新值,因此我使用AuditEvent的Target属性,否则,如果我只需要新值,则使用CustomField属性。

有什么方法可以使以下内容更加通用,从而不必为SimpleResultLeaveRequestIncident等每种类型的对象重复这些行? 不幸的是,被审核的对象之间没有共同点。

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,但是后来我没有正确获得属性。

0 个答案:

没有答案