2010-07-01 5 views

Répondre

26

Je l'ai souvent fait avec un modèle comme celui-ci:

[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"; 
    } 
} 

ne pas oublier les OnDeserializing, comme votre constructeur ne sera pas appelé lors de la désérialisation.

+0

Merci Dan. J'ai une question. La valeur par défaut sera XeroxScan mais si un utilisateur passe HPScan cela prendra HPScan correctement? – acadia

+0

Voulez-vous dire s'ils transmettent un périphérique dans le constructeur? Si oui, vous pouvez définir la propriété dans le constructeur après avoir appelé SetDefaults et utiliser la nouvelle valeur. Si vous voulez dire quand les données sont désérialisées, cela fonctionnera également, puisque OnDeserializing est appelé avant la désérialisation. De cette façon, vous pouvez définir tout votre état initial 'par défaut' avant que vos propriétés ne soient remplies pendant la désérialisation. –

+0

J'ai essayé mais ça ne semble pas fonctionner. OnDeserializing n'est pas seulement utilisé avec la sérialisation binaire? – xr280xr

5

Si vous voulez toujours par défaut à XeroxScan, pourquoi ne pas faire quelque chose de simple comme:

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

Bonjour kd7, votre solution fonctionne uniquement si nous utilisons DataContract du côté service, mais pour les demandes entrantes où ce DataContract est passé en argument, cela ne fonctionne pas. En tant que solution alternative, nous devons créer deux propriétés [une normale et une nullable] dans le DataContract et exposer un type nullable en tant que DataMember et définir les valeurs du champ exposé au champ non exposé. – ajaysinghdav10d

+0

Son amende pour le type par défaut et pour d'autres juste définir dans le constructeur beaucoup plus élégant à mon humble avis – user1496062

Questions connexes