有可能以任何方式(包括 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/