我有一个.net程序集,它公开了一个公共类(名为A),使用反射(Assembly.CreateInstance)创建其他程序。现在,它工作正常。
但是现在我有两个A的子类,比如A1和A2,我需要创建一个或另一个,具体取决于运行时检查。客户端无法修改,应该相信返回的对象是A类。
如果我使用的是COM而不是.net,那就很容易了:只需将支票添加到IClassFactory.CreateInstance即可。但是有没有办法在.net中执行此操作?
注意:使用代理对象或类似对象的明显解决方案是不实际的,因为A类有几百个方法(!),我不想重新路由所有这些方法。
答案 0 :(得分:2)
首先,应该注意的是,如果您的客户可以使用您提供的工厂方法而不是必须劫持Activator.CreateInstance
,那将会更容易。在阅读之前请完整考虑......
以下是使用ContextBoundObject
的示例 - 它使用计数器作为“运行时检查”来确定B
和C
之间的实际对象,即使调用者要求{ {1}}。请注意,如果他们使用A
。
new A()
所以是的,你可以卑鄙地对待来电者给他们一些不同于他们要求的东西; p这是相当邪恶的代码。 YMMV等。