假设我想在另一个函数中包装一个函数,所以要为包装函数添加一些功能。但由于方法是作为Web服务代理生成的,因此我事先不知道返回类型或参数。
我的第一个思路是使用Func<T>
。但是有些函数可能会返回void,在这种情况下Action<T>
会更合适。
现在我的问题:是否有一个很好的通用方法来实现这一目标?我需要寻找一些模式吗?
答案 0 :(得分:3)
嗯,Facade Pattern浮现在脑海中......这不是一种非常自动的做事方式,但它有效。您基本上只是将另一个接口放在代理前面并调用它。然后,您可以添加所需的任何功能。
另一种解决方法是使用aspect oriented programming。我曾经使用PostSharp(当它是免费的时候)这样做过去。您可以通过向方法/属性添加属性来执行在函数中添加前/后处理的操作。然后,AOP组件使用代码编织来重写IL以包含您引用的代码。请注意,这可能会显着减慢构建过程。
答案 1 :(得分:1)
如你所说“我事先并不知道返回类型或参数”,我认为动态代理就是你的意思 需要。
不幸的是,我只了解Java中的动态代理。但我确信,C#也有类似的东西。
尝试谷歌搜索“动态代理C#”。
例如,C#似乎有一个实现:http://www.castleproject.org/dynamicproxy/
那么,什么是动态代理?
来自JavaDoc http://docs.oracle.com/javase/1.3/docs/guide/reflection/proxy.html#api:
动态代理类是实现在运行时指定的接口列表的类,以便通过类实例上的一个接口进行的方法调用将被编码并分派到另一个对象通过统一的界面。因此,动态代理类可用于为接口列表创建类型安全的代理对象,而无需预生成代理类,例如使用编译时工具。动态代理类的实例上的方法调用被分派到实例的调用处理程序中的单个方法,并且它们使用java.lang.reflect.Method对象进行编码,该对象标识调用的方法和包含参数的Object类型数组。