【问题标题】:How to return dynamic and strongly typed object from a method [duplicate]如何从方法返回动态和强类型对象[重复]
【发布时间】:2019-02-12 06:41:16
【问题描述】:

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

  dynamic obj = JObject.Parse(jsonString);

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

【问题讨论】:

  • 实现IDynamicMetaObjectProvider接口或从实现它的框架类继承,如DynamicObjectExpandoObject
  • 你不能同时拥有“动态”和“强类型”。它们是截然相反的。
  • @Enigmativity 完全正确
  • @DaveM 好的,我去看看!谢谢!

标签: c# .net json.net


【解决方案1】:

通过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

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 2016-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多