2010-08-30 61 views
1

我在这里有一个难题,我甚至不确定这是可能的。在运行时使用动态类/属性来加载配置

我正在开发一个基于插件的应用程序,其中所有插件都可以访问(读取/写入)主机应用程序上的共享配置。有实现我提出的问题更简单的方法,但由于这是一个与工作无关的项目,我可以自由地玩:)

比方说,我们有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而是让它们是动态的,当被要求退换。

它看起来像一个伸展,但是这是可能的吗?

回答

3

我不认为你想实现IDynamicObject接口,我建议你从DynamicObject继承Config继承。至少在你的例子中,你会想覆盖TryGetMember和TrySetMember。如果您想动态调用方法,TryInvokeMember将是必需的。实现整个界面要困难得多。

因此,您的配置类将需要继承DynamicObject并实现IConfiguration。然后,您可以将该字段声明为动态项目或IConfiguration对象,并在您希望使用其动态行为之前将其强制转换为动态项目。

+1

就是这样! – Timwi 2010-08-30 08:02:55

+0

+1 @Timwi,并不意味着踩你的动态脚趾,我认为你的意思是动态对象,但IDynamicObject(我相信它被替换为IDynamicMetaObjectProvider,虽然我找不到这个事实的简洁文档)不是为了晕倒的心脏和试图实现GetMetaObject比任何除了编写库/框架之外的任何目的都需要的更加通用和更通用。 – marr75 2010-08-30 08:12:58

+0

哇!这正是我所需要的。谢谢一堆! – 2010-08-30 08:22:11