我正在尝试创建一个Web服务来处理异步应用程序的所有日志记录,我可以在其中发送两个相同的对象并比较每个属性。然后创建已更改的属性的日志。
我遇到的问题,我不知道apicontroller如何接受任何对象:
这是我到目前为止:
public class PropertyLogApiCall
{
public string Id { get; set; }
public string Username { get; set; }
public string Task { get; set; }
public object OldEntity { get; set; }
public object NewEntity { get; set; }
public string OldEntityType { get; set; }
public string NewEntityType { get; set; }
}
POST - ApiController
public void Post(PropertyLogApiCall paramList)
{
try
{
var id = paramList.Id;
var username = paramList.Username;
var task = paramList.Task;
var newType = Type.GetType(paramList.NewEntityType);
var oldType = Type.GetType(paramList.OldEntityType);
var newEntity = Convert.ChangeType(paramList.NewEntity, newType);
var oldEntity = Convert.ChangeType(paramList.OldEntity, oldType);
var properties = oldEntity.GetType().GetProperties();
var logsToSave = new List<PropertyLog>();
var dateTimeStamp = DateTime.Now;
foreach (var property in properties)
{
var oldValue = property.GetValue(oldEntity, null);
var newValue = newEntity.GetType().GetProperty(property.Name).GetValue(newEntity, null);
var propertyType = property.PropertyType;
var name = oldEntity.GetType().Name;
var propName = property.Name;
PropertyLog log = null;
if (propertyType == typeof(string))
{
log = CreateLogString(oldValue, newValue);
}
else if (propertyType == typeof(int))
{
log = CreateLogInt(oldValue, newValue);
}
if (log != null)
{
log.Created = dateTimeStamp;
log.EntityId = id;
log.Username = username;
log.EntityName = name;
log.Property = propName;
log.Task = task;
logsToSave.Add(log);
}
}
//Save Logs
.....
}
catch (Exception e)
{
//send email
}
这不起作用,因为大多数时候newType / oldType为null。而且某些实体没有实现IConvertible接口。
这甚至可以吗?
答案 0 :(得分:0)
正如您所说,在许多场景中您没有对象类型,您需要动态地执行此操作。如果你不知道它的类型,就不可能重新创建一个对象。
将操作的参数更改为dynamic
,将动态创建对象,包括请求中的所有属性。然后,您需要逐步浏览OldEntity
的所有属性,并将它们与NewEntity
上的属性进行比较。如果属性可以是具有附加属性的复杂对象,则必须以递归方式执行此操作。但是,在SO中您可以获得以下信息:How do I enumerate through a JObject?
您可以从此SO Q&amp; A:Comparing dynamic objects in C#获得想法。
或者,如果您将其作为JSON发布,则可以将参数作为JObject
接收,并对其进行相同的操作。目前http://www.newtonsoft.com/已关闭,因此我无法向您提供指向JObject
文档的确切指针。