【问题标题】:Dynamic creation of object instances动态创建对象实例
【发布时间】:2015-02-06 19:43:27
【问题描述】:

我们有一个系统可以创建动态定义的对象作为处理的核心方面。我希望能够创建一个类对象并使这些对象成为此类的实例,实现该特定对象具有的所有功能。

问题是,这些对象确实需要从基类动态继承,并覆盖空方法等。本质上,我需要一些动态类结构(我建议将定义编译成适当的类模型,但那是一段距离)。我能想到的最好方法是创建一个具有一组空白属性的类实例,如果实现了这些功能,则用方法动态替换这些属性。

我还研究了 Castles DynamicProxy 方法,这可能是一条有用的路线(拦截调用并在适当的情况下对其进行操作),但这似乎比应有的复杂。

所以有什么建议吗?最好的、最类似于 .Net 的方法是什么?当我看到这个问题时,似乎应该有一个非常好的和简单的解决方案。


只是为了帮助,一个简单的例子(半伪代码 - 我知道它没有完全工作):

class thing
{
    public void Process()
    {
        foo();
        bar();
    }
    private foo(){}
    private bar(){}
}

a=new thing() {foo=DoFoo}
b=new thing() {bar=DoBar}

我希望能够调用 a.Process 和 b.Process,并让它们都运行。请记住,这些对象有大约 20-30 个可能需要设置的属性/方法(设置它们很容易,但其中一些可能是实质性方法)

【问题讨论】:

    标签: c# dynamic


    【解决方案1】:

    使用一组空白属性创建一个类实例,如果实现了这些功能,则用方法动态替换这些属性

    这听起来很像“装饰器”设计模式,这可能是您的不错选择。您基本上实现了一组功能,然后通过随后将几个“装饰”(功能)分配给基本对象来构建您的对象。

    http://www.codeproject.com/Articles/479635/UnderstandingplusandplusImplementingplusDecoratorp 似乎是一个很好的总结,其中包含有关如何以及何时使用装饰器模式的清晰示例

    但是,如果您的属性之间存在大量交互,或者需要根据其他“装饰”进行显着不同的实现,我不建议使用装饰器。在这种情况下,您可能需要更具体地了解您的要求。

    【讨论】:

    • 我确实看过装饰器。我担心的是向一个对象添加 20 个装饰器是否合适且有效。我认为大多数交互都可以通过这个过程来管理,添加一组函数。
    • 由于装饰对象通常是由应用程序在运行时完成的,这应该不是问题。装饰器模式几乎和继承你的基类一样有效。但是,如果您需要通过在代码中调用 20 多个装饰器来手动创建装饰对象,我会分享您对适当方法的担忧。
    • 让我担心的是创作动力的规模。只需一两个,装饰器就很清楚了。对于具有动态功能的小对象,DynamicObject 是合适的。但这些将是大型、高度动态的对象(具有大型、高度动态的子对象!),因此似乎值得寻求洞察力。
    • 这听起来像是您的对象的功能会根据您的装饰而发生巨大变化?从您最初的帖子和您提供的示例中,我仍然会坚持我的建议,将其实现为装饰器模式。但是,如果您担心复杂性,可能值得考虑一下是否真的有必要在此级别上使对象完全动态化,或者您是否可以稍微分解功能以使事物更加静态。但是,如果不知道确切的上下文,很难判断您的情况。
    • 我不明白为什么 DynamicObject 不适合大型对象。我将它用作实体包装器(以使它们可观察)并且像魅力一样工作,即使对于大型实体也是如此。您可以根据需要分离功能,并且不需要将它们全部放在一个大类中(您可以根据需要对其进行子类化)。我不确定 真正的 问题是什么(除了你所说的),但从你的 cmets 和问题来看,我认为你想多了,提出了一个过于复杂的解决方案,正如我所说,如果没有真正的问题,很难说这是否合理
    【解决方案2】:

    不确定我是否真的了解您的要求,但您看过DynamicObject 课程吗?

    其背后的想法是您从它派生,并且每次访问成员时,都会调用TryGetMemberTrySetMemberTryInvokeMember 获取方法,您可以在其中执行自定义逻辑。

    您可以创建一个从DynamicObject 继承的基类,然后通过从该基类派生并在每个基类上实现逻辑来创建您想要的一组类,这样您就可以同时拥有已定义的成员和其他非- 定义的,您可以使用 dynamic 类型。

    检查documentation on MSDN 是否有DynamicObject

    另类

    否则,作为一个非常简单的解决方案,并且基于您仅提供的伪代码(诚然,对于问题中所述的要求,这可能有点简单),您可以创建一个具有 @987654330 的 Thing 类@属性:

    class Thing
    {
        public void Process()
        {
           if(Foo!=null) Foo();
           if(Bar!=null) Bar();
        }
        public Action Foo {get;set;}
        public Action Bar {get;set;}
    }
    
    var a=new Thing() {Foo=DoFoo};
    var b=new Thing() {Bar=DoBar};
    a.Process();
    b.Process();
    

    【讨论】:

      猜你喜欢
      • 2013-10-20
      • 2016-01-29
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多