包装函数的通用方法

本文关键字:方法 函数 包装 | 更新日期: 2023-09-27 18:18:35

假设我想将一个函数包装在另一个函数中,因此要向包装的函数添加一些功能。但是我事先不知道返回类型或参数,因为方法是作为web服务代理生成的。

我的第一个想法是使用Func<T>。但是有些函数可能会返回void,在这种情况下,Action<T>会更合适。

现在我的问题是:有没有一种很好的通用方法来实现这一点?有什么我需要寻找的模式吗?

包装函数的通用方法

嗯,我想到了Facade Pattern…这不是一种非常自动的做事方式,但它很有效。你只需要在代理前面放另一个接口然后调用它。然后你可以添加任何你想要的功能。

另一种方法是使用面向方面的编程。我曾经使用过PostSharp(当它是免费的时候)来做这件事。您可以通过向方法/属性添加属性来在函数中添加Pre/Post处理。然后AOP组件使用代码编织来重写您的IL,以包含您引用的代码。请注意,这会显著地减慢构建过程。

正如你所说的"我事先不知道返回类型或参数",我认为动态代理就是你所需要的需要的。

不幸的是,我只知道Java中的动态代理。但我敢肯定,c#也有类似的东西。

试试google一下"Dynamic Proxy 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类型数组对其进行编码。