最好用代码来解释我的意图。所以现在我有以下代码:
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。