最好用代码来解释我的意图。所以现在我有以下代码:
class A, IInterfaceUsedByB
{
}
class B
{
void func(A someObject)
{
func2(someObject, 1);
func3(someObject, "string");
func4(someObject, new MyObject());
var anotherObject = someObject.NewInstance;
func2(anotherObject, 1);
.......................
}
func2(A someObject, int val);
func3(A someObject, string val);
func4(A someObject, C val);
}
其中func2
, func3
,func4
确实需要对 someObject 的引用。我想将其更改为
void func(A someObject)
{
with(someObject,
() =>
{
func2(1);
func3("string");
func4(new MyObject());
}
);
var anotherObject = someObject.NewInstance;
with(anotherObject,
() =>
{
func2(1);
.......................
}
);
}
甚至更好
void func(A someObject)
{
func2(1);
func3("string");
func4(new MyObject());
}
这样我就不必拖动这个 someObject,但我仍然应该能够在 func2、3、4 中使用它。换句话说,这就像为特定代码块设置一些上下文对象。为此,我可以使用三种语言(C#、F# 或 IronPython)中的任何一种。
更新在理想的解决方案中,B 类将独立于 A。func*
函数仅依赖于 A 的一个由 2 个方法组成的小接口。
UPDATE2 someObject 对于不同的函数调用可能不同。
UPDATE3我不认为只有使用类、接口或扩展方法等语言原语才能做到这一点。我认为解决方案可能会使用更多的 hackish 工具,例如属性、反射或 F# 的计算工作流功能。或者 IronPython 的一些动态特性。本质上,我想做的是创建一个小型嵌入式 DSL。