2010-08-30 90 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