【问题标题】:C#: How to populate an objects readonly properties from a parent classC#:如何从父类填充对象的只读属性
【发布时间】:2012-07-20 08:18:34
【问题描述】:

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

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

【问题讨论】:

    标签: c# class inheritance plugins


    【解决方案1】:

    我在这里看到两个问题:

    1. 如何将SystemLog传递给要使用的插件?
    2. 如何保护 SystemLog 免受插件的影响?

    让我从第二个开始。您可以声明类似

    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[]) 并在上面传递一个包装器实例。

    【讨论】:

    • 太棒了。我知道这是可能的,这看起来像门票。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 2011-06-13
    • 1970-01-01
    相关资源
    最近更新 更多