委托给私有函数作为不同 class 中方法的参数

Delegate to private function as argument for method in different class

让我们使用私有方法 f()g() class A。让classB有public方法h。是否可以将指向 A.g 的 pointer/delegate 从方法 A.f 传递给 B.h

考虑以下代码:

Class B
{
    public B() {}

    public h(/*take pointer/delegate*/)
    {
        //execute method from argument
    }
}

Class A
{
    private int x = 0;
    private void g()
    {
        x = 5;
    }

    private void f()
    {
        B b = new B();
        b.h(/*somehow pass delegate to g here*/);
    }
}

调用 A.f() 后,我希望 A.x 成为 5。可能吗?如果是,怎么做?

是的,有可能:

class B
{
    public B() {}

    public void h(Action a)
    {
        a();
    }
}

class A
{
    private int x = 0;
    private void g()
    {
        x = 5;
    }

    private void f()
    {
        B b = new B();
        b.h(g);
    }
}

Here 是一个 fiddle 表明它有效 - 为了演示目的,我将一些私人更改为 public。

您可以为您的方法创建一个 Action 参数:

public h(Action action)
{
    action();
}

然后这样称呼它:

b.h(this.g);

可能值得注意的是 Action 的通用版本表示带参数的方法。例如,Action<int> 将匹配具有单个 int 参数的任何方法。

是的。

class B
{
    public B()
    {
    }

    public void h(Action func)
    {
        func.Invoke();
        // or
        func();
    }
}

class A
{
    private int x = 0;

    private void g()
    {
        x = 5;
    }

    private void f()
    {
        B b = new B();
        b.h(g);
    }
}