【问题标题】:Implementing DynamicObject functionality on a class that extends another class在扩展另一个类的类上实现 DynamicObject 功能
【发布时间】:2013-08-01 15:49:41
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: c# dynamic dynamicobject


    【解决方案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 来进行蹦床排序,那么您的动态属性或方法就有了自己的命名空间。

    【讨论】:

    • 但是我现在看的是IDynamicMetaObjectProvider,它不会解决这个问题吗?根据文档,这是我可以将动态添加到从另一个类继承的类的确切情况。
    • 确实如此,但工作量很大。如果你想走这条路,我会对结果完全感兴趣。
    • 现在正在调查。我的表情没有那么复杂,希望不会那么难。但我认为这需要时间。
    猜你喜欢
    • 1970-01-01
    • 2011-10-08
    • 2017-12-10
    • 2014-04-21
    • 2013-05-24
    • 2016-04-28
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多