1

我有一个容器,我听它的变化。根据我从更改提要中收到的文档类型,我会在为我的阅读量大的应用程序填充或更新我的物化视图容器时以不同的方式处理每个文档。

在最新的扩展 v4.x 中,来自更改提要的文档传递到 a 中的函数IReadOnly<T>不再将 Document 作为 T 并且需要具体类型。

System.string传递 'dynamic' 会引发 'can not cast '异常,System.IReadOnly<System.object>这显然表明函数接收 JSON 集合并将其反序列化为 T 的集合。

目前,作为一种解决方法,在我的本地开发环境中,我为集合中的每种类型创建了一个函数,并根据需要对其进行处理。

这种方法的缺点是它在生产中会很昂贵,因为每次更新都会调用所有函数。吃光我的功能调用配额。因此,将调用 10 个函数而不是单个函数调用,其中 9 个函数完全什么都不做,只是检查它们是否必须做任何事情然后返回。

我的类型都共享一个基类,该基类具有四个属性(id、pk、ttl 和标签(这是我用来区分我的类型的区分属性)。但是使用此基类型作为 T inIReadOnly<T>不是一种选择同样,因为在反序列化之后,除了它定义的四个属性之外,所有其他属性都将丢失。

4

1 回答 1

2

假设使用的序列化程序是 Newtonsoft,您可以使用该类型JObject进行反序列化。从中读取标签,并根据标签反序列化为您的不同类之一。

var json = "{\"Label\": \"Example\", \"IsSuccess\": true }";
var jObject = JsonConvert.DeserializeObject<JObject>(json);
var label = (string) jObject.Property("Label");
if (label == "Example")
{
    var example = jObject.ToObject<Example>();
    Console.WriteLine(example.IsSuccess);
}
public class Example
{
    public string Label { get; set; }
    public bool IsSuccess { get; set; }
}
于 2021-11-10T11:14:02.463 回答