如何取消 Delta 对象上的 属性

How to unset a property on a Delta object

我正在使用 Azure 移动应用服务,并且在 PATCH 方法中我接收到一个类型为 Delta 的对象(参见 MSDN)。

我收到一些具有空值的字段,我想从 Delta 输入对象中删除这些字段:我该如何执行此操作?

例如我有一个 JSON 输入像

{
    "Content":"test",
    "CreatedAt":null
    ...
}

这映射了一个继承自 Microsoft.Azure.Mobile.Server.EntityData 的实体 例如

public class MyBean : EntityData
{
    public MyBean() { }
    public string Content { get; set; }
}

我想删除字段 "CreatedAt",顺便说一句,它是在 EntityData 父对象中声明的,它是 Microsoft 库的一部分(因此我无法直接访问它)。

如果您使用 Newtonsoft.Json 来序列化实体,那么您可以使用 属性 的 conditional serialization

To conditionally serialize a property, add a method that returns boolean with the same name as the property and then prefix the method name with ShouldSerialize. The result of the method determines whether the property is serialized. If the method returns true then the property will be serialized, if it returns false then the property will be skipped.

public class MyBean : EntityData
{
    public MyBean() { }
    public string Content { get; set; }

    public bool ShouldSerializeCreatedAt()
    {        
        return false;
        // Or you can add some condition to whether serialize the property or not on runtime 
    }
}

我认为您不应该尝试删除 CreatedAt,而是获取传入的 Delta 并创建一个新的。您可以包含所需的字段或排除不需要的字段。

var newDelta = new Delta<MyBean>();
foreach(var fieldName in patchDelta.GetChangedPropertyNames()){
  if(fieldName != "CreatedAt"){
    if(patchDelta.TryGetPropertyValue(fieldName, out object fieldValue)){
      newDelta.TrySetPropertyValue(fieldNAme,fieldValue);
    }
   }
}