如何从方法返回动态和强类型对象

时间:2018-09-07 00:03:24

标签: c# .net json.net

例如,在JSON.NET中,您可以调用JObject.Parse并返回具有某些属性的JObject,但是如果您调用:

  dynamic obj = JObject.Parse(jsonString);

我可以在该对象上调用JObject上不存在的属性。

1 个答案:

答案 0 :(得分:3)

通过dynamic调用属性仍为strongly typed,但不是statically typed(与大多数C#相反)。

也就是说,我不能创建这样的类:

public class Test
{
    public string Name { get; set; }
}

并像这样使用它:

dynamic myClass = new Test { Name = "John" };
myClass.Age = 30;

myClass.Age = 30;行将成功编译,但在运行时将引发异常。这是因为基础对象仍为强类型,并且未实现属性Age。使用dynamic并不会使您失望,它只是将检查类型的责任从编译器转移到了运行时。

好,现在为什么行得通?:

dynamic myClass = new ExpandoObject();
myClass.Name = "John";

嗯,ExpandoObject有一个特殊的接口:IDynamicMetaObjectProvider。这样,运行时就可以检查对象的其他(运行时创建的)属性,方法等,然后获取并设置这些值,无论它们是内存中的值还是委托方法等。

这是dynamic test = JObject.Parse(jsonString);允许您以与应用程序中的具体类相同的方式访问JSON元素的方式。运行时只需查询IDynamicMetaObjectProvider接口以获取所需的属性。

您可以阅读有关实现自己的动态对象here的更多信息。