对象实例的动态创建
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 了吗?
它背后的想法是你从它派生,每次访问一个成员时,它都会调用 TryGetMember
、TrySetMember
或 TryInvokeMember
的方法,您可以在哪里执行自定义逻辑。
您可以创建一个继承自 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();
我们有一个系统可以创建动态定义的对象作为处理的核心方面。我希望能够创建一个 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 了吗?
它背后的想法是你从它派生,每次访问一个成员时,它都会调用 TryGetMember
、TrySetMember
或 TryInvokeMember
的方法,您可以在哪里执行自定义逻辑。
您可以创建一个继承自 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();