c# - 没有 IDynamicMetaObject 的 C# 中的动态?

标签 c# .net dynamic clr

An object can provide its binding semantics by implementing IDynamicMetaObject Provider—or more easily by subclassing DynamicObject, which provides a default implementation of this interface.

source

我从未实现过这个接口(interface)或类,并且总是能够动态执行事情:

public class aa
    {
        public void bbb()
        {  }
    }

dynamic a = new aa().bbb();

那么这句话是什么意思呢?

我试图了解何时需要使用 IDynamicMetaObject 或 DynamicObject 继承

最佳答案

dynamic 关键字会导致对对象的引用被后期绑定(bind),并且仅在运行时解析。通常,这是因为您使用的是 IDynamicMetaObjectProvider 实现器,它允许您的代码决定如何处理运行时属性解析。也就是说,您可能希望在运行时添加和删除属性(通常作为字典实现,如 ExpandoObject)。

您的示例代码所做的只是阻止编译类型类型检查。事实上,这比什么都不做更糟糕,因为如果您编写的代码访问了类中不存在的属性或方法,它仍然可以编译,但当然会在运行时崩溃。我想不出很多充分的理由来使用 dynamic 来引用具体类(除了柔软的类型转换或鸭子类型,但我们通常在 C# 中使用接口(interface)来处理类似的事情!)

从我自己的项目之一继承 DynamicObject 的动态对象的示例实现:

https://github.com/jamietre/IQObjectMapper/blob/master/source/IQObjectMapper/IQDynamicObject.cs

(它对工厂方法进行一次调用,该方法返回一个带有选项的新字典,要使其不依赖,您所需要做的就是更改构造函数:

InnerDict = ObjectMapper.MapperCache.GetDictionary<object>(Options);

至:

InnerDict = new Dictionary<string,object>();

并摆脱一些检查选项的条件

关于c# - 没有 IDynamicMetaObject 的 C# 中的动态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10465729/

相关文章:

c# - .NET 中用于故障测试的损坏数据集

c# - 我必须删除处理程序吗

c# - 通用委托(delegate)变量

c# - 如何使用 OAuth 连接到 Etrade API?

haskell - 在 Haskell 中,如何在 Dynamic TypeRef 上做一个 case 语句

javascript - 使动态命名的 iframe 可编辑

c# - Ubuntu 下最好的 C++ 或 Mono 编程 IDE 是什么?

c# - 在 C# 中使用可空类型

C#串口读取错误

.net - 继承自 List(of T) 类的问题