2010-07-01 8 views
15

Wie kann ich einen Standardwert an einen Datamember zum Beispiel für das unten gezeigte gesetzt:Default-Wert in einem DataContract setzen?

Ich möchte ScanDevice = „XeroxScan“ vorbelegt

[DataMember] 
    public string ScanDevice { get; set; } 

Antwort

26

Ich habe in der Regel getan dies mit setzen ein Muster wie folgt aus:

[DataContract] 
public class MyClass 
{ 
    [DataMember] 
    public string ScanDevice { get; set; } 

    public MyClass() 
    { 
     SetDefaults(); 
    } 

    [OnDeserializing] 
    private void OnDeserializing(StreamingContext context) 
    { 
     SetDefaults(); 
    } 

    private void SetDefaults() 
    { 
     ScanDevice = "XeroxScan"; 
    } 
} 

Sie das OnDeserializing nicht vergessen, wie Ihr Konstruktor wird während der Deserialisierung aufgerufen werden.

+0

Dank Dan. Ich habe eine Frage. Der Standardwert ist XeroxScan, aber wenn ein Benutzer HPScan passiert, wird HPScan richtig sein? – acadia

+0

Meinst du, wenn sie ein Gerät in den Konstruktor übergeben? Wenn ja, können Sie die Eigenschaft im Konstruktor festlegen, nachdem Sie SetDefaults aufgerufen haben, und den neuen Wert verwenden. Wenn Sie meinen, dass die Daten deserialisiert werden, funktioniert das auch, da OnDeserializing vor dem Deserialisieren aufgerufen wird. Auf diese Weise können Sie Ihren anfänglichen Standardstatus festlegen, bevor Ihre Eigenschaften während der Deserialisierung gefüllt werden. –

+0

Ich habe das versucht, aber es scheint nicht zu funktionieren. Wird OnDeserializing nicht nur bei der binären Serialisierung verwendet? – xr280xr

5

Wenn Sie es wollen immer XeroxScan auf Standard, warum nicht etwas einfach tun:

[DataMember(EmitDefaultValue = false)] 
public string ScanDevice= "XeroxScan"; 
+0

Hallo kd7, Ihre Lösung funktioniert nur, wenn wir den DataContract auf der Service-Seite verwenden, aber für eingehende Anfragen, bei denen dieser DataContract als Argument übergeben wird, funktioniert das nicht. Als alternative Lösung müssen wir im DataContract zwei Eigenschaften [One Normal und One Nullable] erstellen und einen Nullable-Typ als DataMember verfügbar machen und die Werte aus dem exponierten Feld auf das Non-Exposed-Feld setzen. – ajaysinghdav10d

+0

Es ist gut für den Typ Standard und für andere nur im Konstrukteur viel eleganter IMHO gesetzt – user1496062