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

时间:2013-08-01 15:49:42

标签: c# dynamic dynamicobject

我需要建议一个模拟C#类的多重继承的最佳方法,需要通过支持动态来扩展。

我有一个类MainClass不需要依赖于DLR - 它的所有属性和方法都是静态编译的。它有很多重载运算符。它是某种DSL。

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

这就是DynamicObject是一个类而不是一个接口的问题。所以ExtendedClass只能从DynamicObject派生,这意味着它应该基本上复制所有MainClass功能。

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

1 个答案:

答案 0 :(得分:1)

很难说这么一般的描述。我熟悉的常见模式是:

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来排序蹦床。