对象实例的动态创建

Dynamic creation of object instances

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

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

我还研究了 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 properties/methods 可能需要设置(设置它们很容易,但其中一些可能是实质性的方法)

create a class instance with a set of blank properties, and dyamically replace these properties with methods if these features are implemented

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

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

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

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

它背后的想法是你从它派生,每次访问一个成员时,它都会调用 TryGetMemberTrySetMemberTryInvokeMember 的方法,您可以在哪里执行自定义逻辑。

您可以创建一个继承自 DynamicObject 的基础 class,然后通过从该基础 class 派生出您想要的 class 集合,实现逻辑他们中的每一个,这样你就可以同时拥有定义的成员和其他可以使用 dynamic 类型使用的非定义成员。

检查 documentation on MSDN DynamicObject

备选

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

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();