dynamic是C#里面的动态类型,可在未知类型的情况访问对应的属性,非常灵活和方便。
使用Json.Net可以把一个Json字符串转换成一个JObject对象,如果有已知强类型,如果有已知对应的强类型,可以直接转成对应的类型。但如果没有,要访问Json里面对应的数据的时候,就显得比较麻烦。我们可以借助DynamicObject来访问对应的属性。
DynamicObject
我们要创建一个动态类,用于访问JObject,代码如下:
public class JObjectAccessor : DynamicObject { JToken obj; public JObjectAccessor(JToken obj) { this.obj = obj; } public override bool TryGetMember(GetMemberBinder binder, out object result) { result = null; if (obj == null) return false; var val = obj[binder.Name]; if (val == null) return false; result = Populate(val); return true; } private object Populate(JToken token) { var jval = token as JValue; if (jval != null) { return jval.Value; } else if (token.Type == JTokenType.Array) { var objectAccessors = new List<object>(); foreach (var item in token as JArray) { objectAccessors.Add(Populate(item)); } return objectAccessors; } else { return new JObjectAccessor(token); } } }
接下来就可以开始使用它了:
string json = @"{'name': 'Jeremy Dorn','location': {'city': 'San Francisco','state': 'CA'},'pets': [{'type': 'dog','name': 'Walter'}]}"; JObject jobj = JObject.Parse(json); dynamic obj = new JObjectAccessor(jobj); Console.WriteLine($"{obj.name}: {obj.location.city} {obj.location.state}"); Console.WriteLine($"{obj.pets[0].type}: {obj.pets[0].name}");
运行一下程序,看一下输出结果:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
本文向大家介绍详解C# 匿名对象(匿名类型)、var、动态类型 dynamic,包括了详解C# 匿名对象(匿名类型)、var、动态类型 dynamic的使用技巧和注意事项,需要的朋友参考一下 随着C#的发展,该语言内容不断丰富,开发变得更加方便快捷,C# 的锋利尽显无疑。C# 语言从诞生起就是强类型语言,这一性质到今天不曾改变,我想以后也不会变。既然是强类型语言,那编写任一程序均要求满足下面的基本
好吧,我不确定如何表达这个标题(因为我知道子类通常被称为继承类,这不是我在问题中提到的(是的,我知道我从我的例子中的抽象类继承方法。这更多的是为了避免这里的代码重复,并且与我的问题无关),所以我将尽可能地给出一个最好的例子。 我有一个大约有130个属性的类对象,由我的winforms项目中的私有DataTable对象支持。这些多数属性将在数据表中查找一些列(并且可能在将来更新数据表中的所述值)。其
问题内容: 我有一个扩展其超类的子类的对象。子类中有一个重写的方法,可以使用对象调用该方法。可以使用子类对象调用超类的函数吗? 考虑上面的代码。 它在这里打印 子类去 。相反,我必须打印 超类去 。 问题答案: 不,这是不可能的,如果您认为需要,请重新考虑您的设计。覆盖方法的全部要点是替换其功能。如果一个不同的类对该类的内部工作非常了解,那么您将完全取消封装。
我有以下代码来返回对象数组,对象数组中填充了基元类型的结构元素,我不知道如何将基元类型转换为jobject,然后使用SetObjectArrayElement方法设置为ObjectArray, 下面是我的C结构信息 我的JNI代码 写入核心转储失败。核心转储已被禁用。要启用核心转储,请在再次启动Java之前尝试“ulimit-c unlimited” 包含更多信息的错误报告文件保存为:/data1
问题内容: 对象a2的类型为A,但引用了类C的对象。因此,a2应该能够访问m3()。但是,为什么不发生呢?如果在类A中定义了m3()方法,则代码可以正常运行 问题答案: 这意味着您只能访问Class的成员和Class的实现(如果有的话)。 现在m3不是的成员。清楚吗?
问题内容: 我对JNI相对较新,并且掌握了使用JNI处理Java对象中的整数和数组的基本知识。现在,我正在尝试修改/访问Java对象中的Java对象。 我一直在互联网和Stack Overflow上进行搜索,但还没有找到执行该操作的方法。 这是例子。 在Java中: 在JNI中,如何通过ObjectTwo从ObjectOne访问“ buff”?我尝试过这样的事情… 我做错了什么吗? 问题答案: 在