我正在使用一个预构建的第三方类库(想想.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类库中,所以我关注的是如何将对象本身传递给其状态成员?这里进一步概述了这个问题,但我认为提出上述主要问题会更有效.
仅仅拥有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)