c# - 通过替换它们的构造函数将工厂模式强制执行到一组特定的类型

标签 c# interceptor factory-pattern il

有可能以任何方式(包括 IL hack)自动“替换”对特定构造函数的调用,例如

public void Car(Color color)
{
    this.Color = color;
}

通过工厂方法,例如

public static Car Create(Color color)
{
    return new Car(color);
}

那返回原始类型的一个子类型呢?

我想通过一个接口(interface)来归档自动工厂:获取所有类型并替换或至少解决它们的构造函数。

欢迎任何关于拦截和 IL 黑客的想法。我尝试向所有实现该接口(interface)的类型添加扩展方法,但如您所知,静态方法不起作用。

最佳答案

这是一项非常重要的任务,但如果必须这样做,您可以使用 IL Weaving 来完成。我过去在一个测试项目中做过类似的事情,同时试图实现一个已检查的异常库。由于时间限制,我没有抽出时间完成这个。

如果您确实拥有图书馆,那么确实将 ctor 标记为私有(private)就足够了 :) 但我猜想为了提问,您已经用尽了这种可能性。因此,我认为编译时解决方案是不够的。如果他们没问题,但你仍然不想将你的 ctor 标记为私有(private),那么检查 PostSharp我绝对推荐它!

否则,您可以使用Cecil .使用 Cecil,您将能够加载库、加载类型、查找方法以及扫描对 Car 构造函数的调用并将它们替换为您自己的调用。这将是一项需要相当多的 IL 知识的任务,并且涉及到 StackOverflow 的答案。

如果您从程序集 A 启动应用程序并且:

  • 汽车在程序集 B 中定义,所需的所有类型都在 B 中或由 B 引用:卸载 B,在 B 中编织您的更改(如果您不想更改原始副本,则在临时副本中),重新加载 B。
  • 汽车在程序集 B 中定义,但所需类型不在 B 或 A 中:与上述相同,但在编织过程中,您必须添加对所需类型所在程序集的引用。
  • Car 在 A 中,或者您需要在工厂方法中引用 A 中的类型:您需要编织调用程序集(调用 Car ctor 的程序集)。
  • 汽车在 A 中,来电者来自 A:您可以复制装配体,编织装配体,关闭并从编织的装配体重新启动。而不是这种情况考虑使用 PostSharp .

关于c# - 通过替换它们的构造函数将工厂模式强制执行到一组特定的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24932982/

相关文章:

php - 单例结合 PHP5 中的工厂模式

caSTLe-windsor - 为 CaSTLe Windsor 中的所有接口(interface)实现注册拦截器

grails - Grails 3拦截器作为插件

java - 工厂模式中是否需要工厂方法?

java - 具有静态方法的辅助类工厂?

javascript - AngularJS 拦截器类型错误 : Cannot read property 'headers' of undefined

c# - 试图了解 TransactionScope

javascript - Antlr4 词法分析器规则仅应匹配位于行开头的情况

c# - 以编程方式访问样式以获取值

c# - 从具有两种类型的对象的列表中获取 ComboBox 选定值,并且组合框仅显示其中一种