在扩展另一个类的类上实现DynamicObject功能

本文关键字:实现 DynamicObject 功能 扩展 另一个 | 更新日期: 2023-09-27 18:25:47

我需要一个关于模拟C#类的多重继承的最佳方法的建议,该类需要通过对动力学的支持进行扩展。

我有一个类MainClass不需要依赖于DLR——它的所有属性和方法都是静态编译的。它有很多超负荷的操作员。它是某种DSL。

ExtendedClass基本上是一个支持C#动态的MainClass,例如,除了所有MainClass功能外,它还需要重载DynamicObject的TryGetMember/TryInvokeMember,因此客户端可以将其与运行时评估的扩展属性一起使用。

这里出现了DynamicObject是一个类而不是接口的问题。因此ExtendedClass必须仅从DynamicObject派生,这意味着它基本上应该复制所有MainClass功能。

我相信这种情况并不罕见(两个类似的类,其中一个必须派生自某个系统类,因此不可能通过从另一个继承来重用功能)。有没有比直接方法更聪明的方法来处理这种情况:将MainClass作为成员字段添加到ExtendedClass,复制其所有方法/属性,并简单地将其转发到MainClass的包含实例?

在扩展另一个类的类上实现DynamicObject功能

用这样一个非常通用的描述很难说。我熟悉的常见模式是:

public class MainClass{
      foo bar();
      more stuff {get;set;}
      ....
}
public class ExtendedClass:MainClass{
      protected class Helper:DynamicObject{ ...}
      private Helper _helper;
      public Extended(){
          _helper= new Helper(this);
      } 
      public dynamic Extend {
         get{ return _helper};
      }
}

这样,如果您需要首先调用Extend来对蹦床进行排序,那么您的动态属性或方法就有了自己的命名空间。