2012-07-20 38 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

相关问题