我有一个类为构造函数执行Action,让我们说A类。
public class A
{
public A(Action action) {...}
}
我实例化它。
class Program
{
void Main()
{
A a = new A(() => { DoSomethingWith(x); });
}
}
问题是:我如何参考' a'在我的行动?换句话说,我怎样才能取代' x'与' a'? 我试过这个'关键字,但它指的是程序 顺便说一句,我不能为我的构造函数使用其他输入,因为这个项目中的动作非常随机。
答案 0 :(得分:1)
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
。
这似乎确实是一个XY问题,如果可能的话我会避免这样做,因为在调用操作之前很难判断DoSomething
是否正在使用完全初始化的A
,可以使您的对象处于未确定状态。有用处,请小心。
答案 1 :(得分:0)
正如所指出的,您无法在构造函数中分配操作,因为尚未构造def err!
instance.name = 'erroring instance'
raise VeryBad::NotCool if instance.save!
end
。不要将分配操作与运行混淆。您可能希望在创建a
时的不同时间运行操作。
没有必要纵容这种方法(它有点难看,而且可能有更好的方法来达到目的),你可以这样做:
a