最好用代碼解釋我的意圖。所以現在我有以下代碼:擺脫函數的參數
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