将C# DynamicObject转换为任意类型

4

我正在尝试为基于约定的配置绑定程序提供一个良好的消费者API。 ConfigManager.GetSection(...) 返回一个对象,因此我希望返回一个动态对象,当将其强制转换为所需类型时会调用映射器。

在C#4+中是否有一种方法可以创建一个动态类,在应用显式转换后处理调用?

例如:

MyConfig config = (MyConfig)ConfigurationManager.GetSection("some/section");

在这种情况下,ConfigurationManager中的动态对象将被调用来执行一些配置操作(我已解决该问题)。
2个回答

2
是的,DynamicObject 有一个可以重写的 TryConvert 方法。当强制类型转换(或赋值时的隐式转换) DynamicObject 子类时,会调用 TryConvert 方法,并且在返回结果之前,您可以从参数中获取关于调用的动态细节。

binder.Type 属性提供对象需要转换成的类型。例如,在 C# 中的 (String)sampleObject 语句(在 Visual Basic 中为 CType(sampleObject, Type)),其中 sampleObject 是从 DynamicObject 类派生的类的实例,binder.Type 返回 String 类型。binder.Explicit 属性提供有关发生的转换类型的信息。它对于显式转换返回 true,对于隐式转换返回 false。


1
谢谢。在提问之前我已经尝试过了(实现了DynamicObject的每个虚拟方法),但是只看到了异常被抛出 - 结果它们是第一次机会异常,而我在TryConvert被调用之前就放弃了! - Jon Bates

1

有很多项目可以满足您的需求。

例如,请查看AutoConfig


谢谢 - 这个项目部分是为了好玩,但它也会比AutoConfig做更多的事情 - 比如支持任意复杂的对象图、集合和自定义绑定器(以及POCOs)。 - Jon Bates
如果您感兴趣的话,我已经完成了这个项目 - http://www.github.com/spadger/simple-config - Jon Bates

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接