【问题标题】:Generic method to wrap a function包装函数的通用方法
【发布时间】:2011-12-21 15:18:11
【问题描述】:

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

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

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

【问题讨论】:

  • 所以你想包装一个代理?在另一个代理中?
  • 请在此处提供一个具体示例以及您的理由。
  • VS 允许您生成服务引用,我需要为每个方法添加一些功能。换句话说,我想我正在寻找一种实现装饰器模式的通用方法(如果我的词汇是正确的)。不知道返回类型和/或参数列表。
  • @sebt - 仍然需要更多信息。 什么功能你需要添加到每个方法,为什么???
  • @RQDQ,基本上归结为与时间相关的功能。

标签: c# wrapper


【解决方案1】:

好吧,我想到了Facade Pattern...这不是一种非常自动的做事方式,但它确实有效。您基本上只是在代理前面放置另一个接口并调用它。然后,您可以添加任何您想要的功能。

解决此问题的另一种方法是使用aspect oriented programming。我过去曾使用PostSharp(免费时)来执行此操作。您可以通过向方法/属性添加属性来执行诸如在函数中添加 Pre/Post 处理之类的操作。然后,AOP 组件使用代码编织来重写您的 IL 以包含您引用的代码。请注意,这会显着减慢构建过程。

【讨论】:

  • 抱歉反应迟了,公司在假期关门了 :) 与同事讨论后,我们决定选择 T4 代码生成。虽然 AOP 也会在(不久的)将来引起我们的注意。
  • 另一个需要关注的领域是 WMI 性能计数器...我没有 WCF 特定计数器的直接经验,但这可能是获取一些统计数据的低阻抗方式(尤其是考虑到有有很多工具可用于处理性能计数器)。
【解决方案2】:

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

不幸的是,我只知道 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 类型的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 2011-04-24
    相关资源
    最近更新 更多