Man kann in einem schreibgeschützten Feld einer Klasse mit dem strfld
op-Code in der dynamischen Methode speichern, wenn der Besitzer auf diese Klasse gesetzt ist und JIT-Prüfungen deaktiviert sind. Ein Beispiel ist hier . Dieser Ansatz konnte jedoch nicht mit der Klasse funktionieren, die aus F # stammt, nämlich FSharpOption
. Bitte analysieren Sie ein Beispiel unten:
Als Erstes müssen Sie auf die FSharp.Core-Bibliothek verweisen, um sie auszuführen. Dann können Sie durch Ändern von #if true
in #if false
zwischen dem Schreiben eines schreibgeschützten Felds für Tuple
und FSharpOption
wechseln. Bei ersterem funktioniert es perfekt, obwohl beide eine ähnliche Struktur haben, dh ein einzelnes schreibgeschütztes Feld, das über die Eigenschaft zugänglich ist. Für Letzteres verursacht es Verifikationsfehler. Warum ist das so?
Sehr sehr späte Antwort.
Das ist sehr merkwürdig.
Ersetzen Sie MyType
durch das Modul des Feldtyps. Alles beginnt zu arbeiten
Wird:
%Vor%Das ist:
%Vor%wird
%Vor% Der Typ des Feldes, das gesetzt wird, ist string
, also nehmen wir das Modul davon.
Ich würde gerne eine bessere Erklärung zu warum das ist hören.
es stellt sich heraus, dass typeof(string).module
es für jeden Typ funktioniert.
auch wenn ich meinen eigenen Typ so definiere:
Jetzt macht nichts Sinn. Der FSharpOption-Typ lebt im F # -Modul. Die Poco-Klasse lebt in meinem Programm-Modul. und immer noch funktioniert alles, wenn das Modul bestanden ist das Corelib-Modul. Aber nicht, wenn ich eines der beiden (oben genannten) passiere, die Sinn machen würden.
Tags und Links c# f# reflection reflection.emit il