最好用代码解释我的意图。所以现在我有以下代码:摆脱函数的参数
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)中的任何一种。
UPDATE在理想的解决方案中,B类将独立于A. func*
函数仅依赖于包含2个方法的A的小接口。
UPDATE2 someObject对于不同的函数调用可以不同。
UPDATE3我不认为有一种方法只能用类,接口或扩展方法等语言基元来完成此操作。我认为解决方案可能会使用更多的黑客工具,例如属性,反射或F#的计算工作流程特性。或者可能是IronPython的一些动态功能。基本上我想要做的是创建一个小型嵌入式DSL。
听起来像你正在寻找一个全局变量? – Cameron
除了上述两个注释/选项之外,也许您可以使用诸如部分函数应用程序或柯里格之类的东西:http://msmvps.com/blogs/jon_skeet/archive/2012/01/30/currying-vs-partial-function -application.aspx –
@rid'func *'已经是另一个类的方法了。理想情况下,someObject和'func *'类应该是彼此独立的,所以我可以轻松地用另一个类替换someObject而不更改'func *的类 – Max