我正在深入研究反射和指针,遇到了一个有趣的挑战。假设你有以下类:
namespace Foobar
{
internal class Foo()
{
internal static readonly Me = new Foo();
}
}
我可以使用以下命令轻松获取该字段的值:
Assembly a = Assembly.Load("AssemblyWithFoo");
Type t = a.GetType("Foobar.Foo");
FieldInfo fi = t.GetRuntimeFields().First(f => f is { Name: "Me", IsStatic: true });
var bar = fi.GetValue(null);
但是不允许为其设置新值,因为readonly
“代码访问安全”已经过时了。
fi.SetValue(null, new Foo());
因此我考虑使用指针来unsafe
改变这个字段:
var foo = GetFooFromAssembly();
var bar = fi.GetValue(null);
unsafe
{
object* ptr = &bar;
*ptr = foo;
}
这样做的原因是它将bar
变量更改为包含foo
,但不会更改字段,因为bar
变量是静态字段的“副本”,而不是字段本身。
有没有办法获取指向静态只读字段的指针并在其中设置一个新对象?