我可以在构造函数调用中将对象的状态设置为对象本身吗?

And*_*son 6 c# constructor

我正在使用一个预构建的第三方类库(想想.NET Framework ...),它包含一个包含Foo以下成员的类:

public sealed class Foo {
  private object _state;
  public Foo(object state) { _state = state; }
}
Run Code Online (Sandbox Code Playgroud)

Foo包含public _state的制定者.

在特定情况下,我想将设置状态一个的Foo目标对象本身.

不会编译:

Foo f;
f = new Foo(f);   // Compilation error: Use of unassigned local variable 'f'
Run Code Online (Sandbox Code Playgroud)

鉴于上述先决条件,是否有任何我可以设置方式状态一的Foo目标对象本身?


基本原理Timer Windows 8.1中的类不包含使用对象本身Timer(AsyncCallback)分配Timer对象状态的构造函数.我试图将包含此Timer构造函数的.NET代码移植到Windows 8.1类库中,所以我关注的是如何将对象本身传递给其状态成员这里进一步概述这个问题,但我认为提出上述主要问题会更有效.

Mat*_*ten 1

仅仅拥有Foo,这是不可能的。您可以引入一个外观/代理对象并将其传递给构造函数代码,这样您就可以将事情连接起来:

public class FooFacade  {
    private Foo foo;
    public void SetFoo(Foo f) { foo = f; }

    // for each property:
    public X Y { get { return foo.Y; } }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以使用这个门面:

FooFacade ff = new FooFacade();
Foo f = new Foo(ff);
ff.SetFoo(f);
Run Code Online (Sandbox Code Playgroud)

当然,这不是您最初想要的。这种尝试的缺点是对象的状态仅限于其公共表示。

经过反思,只是为了完整性:

// create an uninitialized object of type Foo, does not call constructor:
var f = (Foo)FormatterServices.GetUninitializedObject(typeof(Foo));

// get field:
var stateField = typeof(Foo).GetField("_state", BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.Instance);

// set value to instance itself, invoke on f:
stateField.SetValue(f, f);
Run Code Online (Sandbox Code Playgroud)