动态创建对象实例

时间:2015-02-06 11:17:13

标签: c# dynamic

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

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

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

2 个答案:

答案 0 :(得分:1)

  

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

这听起来很像"装饰"设计模式可能是你的好选择。您基本上实现了一组功能,然后通过随后分配几个"装饰来构建您的对象。 (功能)到基础对象。

http://www.codeproject.com/Articles/479635/UnderstandingplusandplusImplementingplusDecoratorp似乎是一个非常好的总结,有关如何以及何时使用装饰模式的明确示例

但是,如果您的属性之间相互影响很大,或者根据其他"装饰而需要一个重要的不同实现。我不建议使用装饰器。在这种情况下,您可能需要更具体地了解您的要求。

答案 1 :(得分:1)

不确定我是否真的了解您的要求,但您是否看过DynamicObject班级?

它背后的想法是你从中衍生出来,每次访问一个成员时,它都会调用TryGetMemberTrySetMemberTryInvokeMember来获取方法,可以做你的自定义逻辑。

您可以创建一个继承自DynamicObject的基类,然后通过从该基类派生来创建所需的类集,在每个类上实现逻辑,这样您就可以拥有两个已定义的成员,以及您可以使用dynamic类型使用的其他未定义的。

检查DynamicObject的{​​{3}}

替代

否则,作为一个非常简单的解决方案,并且仅基于您提供的伪代码(对于问题中所述的要求,这可能有点简单),您可以创建一个Thing类, 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();