在运行时创建和更改类

本文关键字:运行时 创建 | 更新日期: 2023-09-27 18:07:01

假设我正在接收无穷无尽的"匿名"对象流(JSON/XML/任何),应该是相同的类,但并非所有对象都包含所有字段/属性,例如:

{
 object1 : {field1 : 1, field2: 2},
 object2 : {field1 : 3, field4: 5}
}

正如你所看到的,如果我使用任何一个对象作为模板并创建一个与之匹配的类,另一个将不适合,因为有一个缺失的属性,在有限的对象的情况下,我可以遍历它们并提取所有字段,然后构建一个适合所有的类,并默认每个对象的缺失属性。

然而,在一个"无尽"的流是不可能做到这一点,所以我发现的唯一方法是创建Class1,适合第一个对象,并创建第一个对象,当去下一个对象,如果有一个额外的属性,我将它添加到Class1,并创建Class1的第二个对象,然后再去每个对象。当编辑Class1时,在编辑之前创建的所有对象必须包含新属性,而不必重新创建它们。

你知道怎么做吗?

注意:我不想每次发现一个新字段都创建一个新类,重新创建所有旧对象会花费很多时间,更不用说对象的数量在不断增加。

在运行时创建和更改类

使用Json。Net库的joject类。

1-可以与dynamic

一起使用
string json1 = @"{object1 : {field1 : 1, field2: 2}}";
string json2 = @"{object2 : {field3 : 3, field2: 4}}";
dynamic obj = JObject.Parse(json2);
if (obj.object1 != null) Console.WriteLine(obj.object1.field1);
if (obj.object2 != null) Console.WriteLine(obj.object2.field3);

2-你可以用它作为字典

var jObj = JObject.Parse(json1);
if (jObj["object1"] != null) Console.WriteLine(jObj["object1"]["field1"]);

3-它支持Linq。你可以很容易地枚举它以获得所有的子/后代等。

var rootProperties = jObj.Children().OfType<JProperty>()
                    .Select(p => p.Name).ToArray();