gpt4 book ai didi

c# - 在没有 IDynamicMetaObject 的情况下在 c# 中动态?

转载 作者:太空宇宙 更新时间:2023-11-03 11:22:35 25 4
gpt4 key购买 nike

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 的具体类(期待 squishy typecasting 或 duck-typing,但我们通常在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com