2016-07-15 14 views
2
gefüllt

Ich habe eine Klasse mit zwei Eigenschaften einer gefüllt mit der neuen Auto-Eigenschaft initializer von C# 6.0 und man nur die Getter Stenografie Umsetzung:Auto-Liegenschaften Initializers nicht

public SampleEnum SampleProp1 { get; } = SampleEnum.Value1; 
public SampleEnum SampleProp2 { get { return SampleEnum.Value1; } } 

diese Klasse ist ein Parameter, der einer wcf-Endpunkt Wenn dieser Endpunkt aufgerufen wird, enthält SampleProp1 nur den Standardwert enum.

Warum passiert das?

Antwort

4

Der Initiator der automatischen Eigenschaft in C# 6.0 ist syntaktischer Zucker und der Compiler erstellt ein Hintergrundfeld für die Eigenschaft, die für den angegebenen Ausdruck initialisiert wird.

daher Ihr Code auf die folgende Erklärung entspricht (I eine Klasse'SampleClass` zur Klarstellung hinzugefügt):

class SampleClass 
{ 
    // compiler-generated backing field initialized by the field initializer 
    private readonly SampleEnum __sampleProp1 = SampleEnum.Value1; 

    public SampleEnum SampleProp1 { get { return __sampleProp1; } } 

    public SampleEnum SampleProp2 { get { return SampleEnum.Value1; } } 
} 

Ihr Problem kommt von der Tatsache, dass der von WCF verwendet Deserializer does not execute the field initializers.

Eine mögliche Lösung wäre, die OnDeserializing oder OnDerserialized Attribute zu verwenden und Ihren gesamten Initialisierungscode in eine separate Methode zu platzieren (wie in dieser Frage beschrieben: Field Initializer in C# Class not Run when Deserializing).

+0

Lesen dieser vorbei und boom, etwas gelernt! – Michel

+0

Das Hintergrundfeld ist schreibgeschützt. –

+0

@DmitryDovgopoly: Danke, korrigiert! –

0

Ist SampleEnum wirklich eine Enum? Ich habe Ihren Code in einer einfachen Klasse mit einem tatsächlichen Enum ausprobiert und es schien gut zu funktionieren.

Ich kann sehen, wo es möglicherweise ein Problem von SampleEnum gab, war eigentlich eine Klasse, und Value1 war noch nicht initialisiert worden, wenn die Klasse mit den Eigenschaften initialisiert wurde.

Hier ist, was ich versucht, das wie erwartet funktioniert:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var x = new MyClass(); 
     Debug.Print("{0}", x.SampleProp1); 
     Debug.Print("{0}", x.SampleProp2); 
    } 
    public class MyClass 
    { 
     public enum SampleEnum { Value0, Value1 , Value2 }; 
     public SampleEnum SampleProp1 { get; } = SampleEnum.Value1; 
     public SampleEnum SampleProp2 { get { return SampleEnum.Value1; } } 
    } 
} 
+0

Das Problem kommt vom Deserializer, der den Feldinitialisierer nicht ausführt. Wenn Sie einfach eine Instanz der Klasse mit 'new' erstellen, funktioniert das problemlos. –

+0

Yup. Habe deine Antwort ungefähr zur selben Zeit wie meine gesehen und deine geupdated. Ich hatte keine Serialisierung in Betracht gezogen. Gut gemacht. –

Verwandte Themen