Frage

In meiner Anwendung muss ich dynamisch einen Typ erstellen, der mehrere Eigenschaften enthält. Mir ist bewusst, dass man in solchen Fällen mithilfe eines Ilgenerators einen CIL für Getter- und Setter -Methoden einer Eigenschaft generieren muss.

Mehr durch einen Versuch und Fehler als alles andere bin ich schließlich zu dem folgenden Code angekommen, der eine Settermethode für mich generiert:

MethodBuilder setMethod = customTypeBuilder.DefineMethod(propertyName + "_set", MethodAttributes.Public | MethodAttributes.HideBySig, null, new Type[] {propertyType});
ILGenerator setIlGenerator = setMethod.GetILGenerator();
setIlGenerator.Emit(OpCodes.Ldarg_0);
setIlGenerator.Emit(OpCodes.Ldarg_1);
setIlGenerator.Emit(OpCodes.Stfld, backingField);
setIlGenerator.Emit(OpCodes.Ret);

Der Code funktioniert gut genug, aber es gibt eine Sache, die ich darüber nicht verstehe. Warum ist es notwendig, die Anweisung 'ldarg_0' anzurufen?

Ich weiß, dass es sich auf das implizite erste Argument der Methode bezieht, die "diese" Referenz, sodass der tatsächliche Wert für den Setter im zweiten Argument gespeichert wird. Ich dachte, dass es ausreichen sollte, nur die Anweisung LDARG_1 anzurufen, die das zweite Argument in den Stapel überschreiten würde Mach alles damit), aber dies führt dazu, dass die Zielexzeption ausgeworfen wird, wenn ich versuche, den Wert der Eigenschaft festzulegen.

Vielen Dank!

War es hilfreich?

Lösung

Wenn Sie den Wert "diesen" Wert nicht auf den Stapel drücken, wie würde es dann tun Stfld Wissen Sie, welches Objekt sich ändern soll? Sie könnten versuchen, einen solchen Setter zu schreiben:

public int Bizarre
{
    set { otherObject.Field = value; }
}

Grundsätzlich, Stfld ist dokumentiert Um zwei Werte für den Stapel zu benötigen: eines für das "Ziel" des neuen Wertes und einen für den Wert selbst. Zugegeben, das Stapelübergangsdiagramm in ECMA 335 ist klarer:

…, obj, value => …,

Mit anderen Worten: "STFLD wird die beiden besten Elemente aus dem Stapel streichen".

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top