Kann ich mich darauf verlassen, dass das zugrunde liegende Feld für eine Eigenschaft namens Foo "k__BackingField" heißt?Ist die Implementierung von Auto-Eigenschaften in der Spezifikation?
Antwort
Nein, kurz.
Und aus diesem Grund, Auto-Eigenschaften sind Schmerzen bei der Verwendung mit Feld-basierten Serialisierer wie BinaryFormatter
(ich bin sicher, dass ich das hier schon erwähnt haben; -p).
Siehe: Obfuscation, serialization and automatically implemented properties für einige Gedanken dazu (und eine Lösung).
Natürlich nicht. Das wäre ein privates Implementierungsdetail.
Und warum auf der Erde möchten Sie wissen?
Behebung eines Fehlers in Hessian Serialisierung. Auto-Eigenschaften werden nicht korrekt serialisiert, da sie die Feldnamen verwenden. – ripper234
"Hessian Serialisierung"? Link bitte? Habe nie davon gehört. –
Ich nehme an http://www.hessiancsharp.org/ – ShuggyCoUk
Ich glaube nicht. Wenn Sie das Hintergrundfeld benötigen, verwenden Sie eine 'normale' Eigenschaft.
Dass die Spezifikation nicht den Namen des Backing-Felds angibt (aus gutem Grund - Sie sollten keine Abhängigkeit davon nehmen).
Sie sollten untersuchen, ob der Mono-Compiler zum Beispiel dasselbe tut.
Die Überprüfung, ob das Feld CompilerGeneratedAttribute
angewendet wurde, wäre eine gute Idee.
Beachten Sie, dass explizite Interface-Implementierungen kommen würde (derzeit) als:
<Full.Namespace.To.Interface.IBlah.Foo>k__BackingField
So Code, der einen bestimmten Aspekt einer Klasse auf diese Weise die Irre führen könnte zu serialisiert versucht.
Wenn Sie wirklich Gürtel und geschweifte Klammern über Ihren Code wollten, könnten Sie eine Bibliothek wie Monos Cecil verwenden, um die get-Funktion der Eigenschaft zu untersuchen und das verwendete Feld zu bestimmen.
Ich möchte nur, dass es für mich auf Windows funktioniert, nichts zu ausgefallen - aber das Attribut zu überprüfen ist eine ausgezeichnete Idee, danke. – ripper234
Ich denke, es ist auch sicher mit expliziter Implementierung, da der Name der explizit implementierten Eigenschaft dem Muster 'Full.Namespace.To.Interface.IBlah.Foo' folgt. – nawfal
Re Hessisch; Warum kümmert es sich um Feldnamen? Eigenschaftsnamen wären passender, nein? Wenn nicht, erfinden Sie vielleicht ein Attribut, um das Mitglied zu benennen, dh [Hessian.Storage ("foo")] public int Foo {get; private set;} –
Ich würde lieber den Hack der Kanonisierung des Namens implementieren ( k__backingField - -> Foo) - es ist einfacher für Kunden. –
ripper234
mögliche Duplikate von [Probleme mit Auto-Eigenschaften] (http://stackoverflow.com/questions/371398/problems-with-auto-properties) – nawfal