如何从方法返回动态和强类型对象[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

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

  dynamic obj = JObject.Parse(jsonString);

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

c# .net json.net
1个回答
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的更多信息。

© www.soinside.com 2019 - 2024. All rights reserved.