by Anonymous » 10 Apr 2025, 10:39
Ich bin tiefer in das Verständnis von Reflexion und Zeigern und stieß auf eine interessante Herausforderung. Sagen Sie, Sie haben die folgende Klasse: < /p>
Code: Select all
namespace Foobar
{
internal class Foo()
{
internal static readonly Me = new Foo();
}
}
< /code>
Ich kann den Wert des Feldes einfach mit folgendem erhalten: < /p>
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);
, aber ein neuer Wert in diesen ist nicht zulässig, da es sich bei der Vergleiche und "Code -Zugriffssicherheit" befindet.
Ich habe darüber nachgedacht, Zeiger mit unsicherem zu verwenden, um dieses Feld zu ändern:
Code: Select all
var foo = GetFooFromAssembly();
var bar = fi.GetValue(null);
unsafe
{
object* ptr = &bar;
*ptr = foo;
}
Dies funktioniert insofern, als es die Variable der Balken für Foo ändert, aber nicht das Feld ändert, da die Variable der Balken eine "Kopie" des statischen Feldes ist, nicht das Feld selbst.>
Ich bin tiefer in das Verständnis von Reflexion und Zeigern und stieß auf eine interessante Herausforderung. Sagen Sie, Sie haben die folgende Klasse: < /p>
[code]namespace Foobar
{
internal class Foo()
{
internal static readonly Me = new Foo();
}
}
< /code>
Ich kann den Wert des Feldes einfach mit folgendem erhalten: < /p>
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);
[/code]
, aber ein neuer Wert in diesen ist nicht zulässig, da es sich bei der Vergleiche und "Code -Zugriffssicherheit" befindet.[code]fi.SetValue(null, new Foo());
[/code]
Ich habe darüber nachgedacht, Zeiger mit unsicherem zu verwenden, um dieses Feld zu ändern:
[code]var foo = GetFooFromAssembly();
var bar = fi.GetValue(null);
unsafe
{
object* ptr = &bar;
*ptr = foo;
}
[/code]
Dies funktioniert insofern, als es die Variable der Balken für Foo ändert, aber nicht das Feld ändert, da die Variable der Balken eine "Kopie" des statischen Feldes ist, nicht das Feld selbst.>