2012-07-20 64 views
0

我已經寫了一段代碼中有一個簡單的插件系統。基本上,它需要一個Type,它從基類繼承,並在其上調用「CreateInstance」。然後我調用這個例子中的方法。超類生活在一個SDK DLL中,並且不包含特殊的邏輯/代碼,只是構建插件時覆蓋的骨架方法。C#:如何從一個父類中填充一個對象只讀屬性

我希望能夠爲插件開發人員提供一個名爲「SystemLog」的對象,它可以讓他們編寫日誌輸出。我的問題是,除非使用get/set訪問器公開它,否則在創建實例時如何填充此對象?我希望它對插件開發人員是隻讀的,因爲我不希望它們以某種方式覆蓋它。

回答

2

我在這裏看到了兩個問題:

  1. 如何通過SystemLog到插件要使用它?
  2. 如何保護SystemLog免受插件侵害?

讓我從2號開始。你可以聲明像

public interface ISystemLogger 
{ 
    void log(String message); 
} 

和執行關於SystemLog的頂部簡單的一種包裝的(此包裝的情況下,你可以傳遞給插件)。因此插件只知道大約ISystemLoggger接口,而不是任何種類的它的實現

private sealed class SystemLoggerPluginWrapper : ISystemLogger 
{ 
    private readonly SystemLog inner; 

    public SystemLoggerPluginWrapper(SystemLog inner) { 
    this.inner = inner; 
    } 

    public void log(string message) 
    { 
    inner.log(message); 
    } 
} 
  1. 如果你不使用任何類型的依賴注入和創建實例手動你可以調用pluginType。 GetConstructors()通過它們迭代,如果有一個具有ISystemLogger類型的單一參數,而如果調用CreateInstance(Type),則調用CreateInstance(Type, Object[])並傳遞上面的包裝器實例。
+0

太好了。我知道這是可能的,這看起來像票。謝謝一堆。 – justacodemonkey 2012-07-20 08:37:24

相關問題