C#在运行时创建和更改类

时间:2015-08-07 08:50:55

标签: c#

假设我收到了无休止的"匿名"对象为(JSON / XML / whatever)应该是同一个类,但并非所有对象都包含所有字段/属性,例如:

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

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

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

知道怎么做吗?

注意:每次找到新字段时,我都不想创建新类,它会花费很多时间来重新创建所有旧对象,更不用说对象的数量不断增加。 / p>

1 个答案:

答案 0 :(得分:1)

使用Json.Net库的JObect类。

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();