C#:如何从父类填充对象readonly属性

时间:2012-07-20 08:18:34

标签: c# class inheritance plugins

我在一段代码中有一个简单的插件系统。基本上,它接受一个继承自基类的Type,并在其上调用“CreateInstance”。然后我调用这个实例中的方法。超类存在于SDK DLL中,不包含特殊的逻辑/代码,只包含在插件制作时被覆盖的骨架方法。

我希望能够为插件开发人员提供一个名为“SystemLog”的对象,这将让他们编写日志输出。我的问题是,在创建实例时如何填充此对象,除非我使用get / set访问器将其公开?我希望它对插件开发人员是只读的,因为我不希望它们以某种方式覆盖它。

1 个答案:

答案 0 :(得分:2)

我在这里看到两个问题:

  1. 如何将SystemLog传递给插件想要使用它?
  2. 如何保护SystemLog不受插件影响?
  3. 让我从第二个开始。您可以声明类似

    的内容
    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类型的完全单个参数,则调用{{ 3}}你调用CreateInstance(Type)并传递上面的包装器实例。