解耦依赖和邪恶的捆绑是让它变得伟大的一件独特的事情。其他所有可以辩论并声称以某种本土方式可行的事情。
我一直在用一个旧的和沉重的库重构稍微复杂的系统,并且因为无法打破编译时间依赖性而被阻止 - 因为潜伏在“另一边”的命名委托。所有程序集加载和反射都没有帮助 - 编译器会拒绝将委托() {...} 转换为对象,而您为安抚它所做的任何事情都会在另一边失败。
编译时结构性的委托类型比较在此之后变成名义上的(加载、调用)。当您考虑“我亲爱的库将被所有人永远使用”时,这似乎还可以,但它不能扩展到稍微复杂一点的系统。Fun<> 模板将一定程度的结构等价带回了名义类型的世界。这是您通过推出自己的方式无法实现的方面。
示例 - 转换:
class Session (
public delegate string CleanBody(); // tying you up and you don't see it :-)
public static void Execute(string name, string q, CleanBody body) ...
至:
public static void Execute(string name, string q, Func<string> body)
允许完全独立的代码进行反射调用,例如:
Type type = Type.GetType("Bla.Session, FooSessionDll", true);
MethodInfo methodInfo = type.GetMethod("Execute");
Func<string> d = delegate() { .....} // see Ma - no tie-ups :-)
Object [] params = { "foo", "bar", d};
methodInfo.Invoke("Trial Execution :-)", params);
现有代码没有注意到差异,新代码没有得到依赖 - 地球上的和平:-)