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

C# 如何访问非完全构造的对象?,c#,constructor,action,instantiation,C#,Constructor,Action,Instantiation,我有一个类,它为构造函数执行操作,比如说类a public class A { public A(Action action) {...} } 我将其实例化 class Program { void Main() { A a = new A(() => { DoSomethingWith(x); }); } } 问题是:我如何在我的行动中提到“a”?换句话说,如何用“a”替换“x” 我尝试了“this”关键字,但它指的是程序。 顺便说一句

我有一个类,它为构造函数执行操作,比如说类a

public class A
{
    public A(Action action) {...}
}
我将其实例化

class Program
{
    void Main()
    {
        A a = new A(() => { DoSomethingWith(x); });
    }
}
问题是:我如何在我的行动中提到“a”?换句话说,如何用“a”替换“x” 我尝试了“this”关键字,但它指的是程序。

顺便说一句,我不能为我的构造函数使用其他输入,因为在这个项目中操作是非常随机的。

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

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)
    {

    }
}
公共A类
{
公共A(行动我的行动)
{
我的行动(本);
}
}
公共B级
{
公共图书馆B()
{
var myA=新的A((A)=>{DoSomethingWithA(A);});
}
公共无效文件(A)
{
}
}
这样就可以将其本身作为参数调用。但是,直接的
操作
将不起作用,因为在它完全构建之前,您无法捕获
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();
    }
}
公共A类
{
行动我的行动
公众A(行动)
{
我的行动=行动;
}
公共无效域()
{
我的行动(本);
}
}
班级计划
{
void Main()
{
VarA=新的a((x)=>{DoSomethingWith(x);});
a、 DoMyAction();
}
}

您不能,因为创建动作委托时,
a
未完全构造。这似乎是一个XY问题。请张贴一个更完整的例子,你是什么after@RonBeyer这就是我要找的。请回答我的问题,这样我就可以接受了。非常感谢,这是一个非常好的解决方案。我没有看到我的问题X-Y,我还应该问什么?