在运行时使用动态类/属性来加载配置
问题描述:
我在这里有一个难题,我甚至不确定这是可能的。在运行时使用动态类/属性来加载配置
我正在开发一个基于插件的应用程序,其中所有插件都可以访问(读取/写入)主机应用程序上的共享配置。有实现我提出的问题更简单的方法,但由于这是一个与工作无关的项目,我可以自由地玩:)
比方说,我们有Plugin_A
是继承了PluginBase
抽象类。抽象类公开IConfiguration Config
属性,插件可以访问该属性以写入此共享配置。 IConfiguration Config
由主机在加载插件时正确设置,以限制特定插件将访问的可用配置。
我想要做的就是尝试在C#4.0中使用Dynamic关键字来无缝编写配置类。
在这里伪C#代码就是我想实现
public class Plugin_A: PluginBase
{
public void DoSomethingWithConfig()
{
ShowAMessageBox(Config.SomeMessage);
Config.HasShownMessage = true;
}
}
现在是什么 - 在这个例子中,我不想实际定义.SomeMessage
和.HasShownMessage
而是让它们是动态的,当被要求退换。
它看起来像一个伸展,但是这是可能的吗?
答
我不认为你想实现IDynamicObject接口,我建议你从DynamicObject继承Config继承。至少在你的例子中,你会想覆盖TryGetMember和TrySetMember。如果您想动态调用方法,TryInvokeMember将是必需的。实现整个界面要困难得多。
因此,您的配置类将需要继承DynamicObject并实现IConfiguration。然后,您可以将该字段声明为动态项目或IConfiguration对象,并在您希望使用其动态行为之前将其强制转换为动态项目。
就是这样! – Timwi 2010-08-30 08:02:55
+1 @Timwi,并不意味着踩你的动态脚趾,我认为你的意思是动态对象,但IDynamicObject(我相信它被替换为IDynamicMetaObjectProvider,虽然我找不到这个事实的简洁文档)不是为了晕倒的心脏和试图实现GetMetaObject比任何除了编写库/框架之外的任何目的都需要的更加通用和更通用。 – marr75 2010-08-30 08:12:58
哇!这正是我所需要的。谢谢一堆! – 2010-08-30 08:22:11