如何访问非完全构造的对象?

How to access non fully constructed objects?

我有一个 class 为构造函数执行一个操作,比方说 class A.

public class A
{
    public A(Action action) {...}
}

然后我实例化它。

class Program
{
    void Main()
    {
        A a = new A(() => { DoSomethingWith(x); });
    }
}

问题是:如何在我的操作中引用 'a'?换句话说,如何用 'a' 替换 'x'?
我试过 'this' 关键字,但它指的是 Program.
顺便说一句,我不能为我的构造函数使用其他输入,因为这个项目中的动作非常随机。

a 在构造函数运行之前未完全构造。这意味着此时它在 Action 委托中不可用。如果需要,您可以创建不同类型的 Action 委托:

public class A
{
    public A(Action<A> myAction)
    {
        myAction(this);
    }
}

public class B
{
    public B()
    {
        var myA = new A((a) => { DoSomethingWithA(a); });
    }

    public void DoSomethingWithA(A a)
    {

    }
}

这允许它以自身作为参数被调用。直线 Action 将不起作用,因为您无法在 a 完全构建之前捕获它。

虽然这似乎是一个 X-Y 问题,但我会尽可能避免这样做,因为很难判断 DoSomething 之前是否使用完全初始化的 A该操作被调用,这会使您的对象处于不确定状态。有用途,小心就好

如前所述,您不能在构造函数中分配操作,因为 a 尚未构造。不要混淆 分配 动作与 运行 分配 它。您可能希望 运行 与创建 a 的时间不同。

不一定要宽恕这种方法(它有点丑陋,可能有更好的方法来实现你的目的),你可以做这样的事情:

public class A
{
    Action<A> MyAction
    public A(Action<A> action) 
    {
        MyAction = action;
    }
    public void DoMyAction() 
    {
        MyAction(this);
    }
}

class Program
{
    void Main()
    {
        var a = new A((x) => { DoSomethingWith(x); });
        a.DoMyAction();
    }
}