2013-05-26 9 views
1

Je crée des objets dynamiquement en utilisant Activator (C#) et une de ces classes ressemble:Créer un objet basé sur XmlChoiceIdentifier

class Driver 
{ 
    Driver() { } 

    [XmlChoiceIdentifier("ItemElementName")] 
    [XmlElement("Bit16", typeof(DriverModule))] 
    [XmlElement("Bit32", typeof(DriverModule))] 
    [XmlElement("Bit64", typeof(DriverModule))] 
    [XmlElement("Unified", typeof(DriverUnified))] 
    public object Item { get; set; } 
    [XmlIgnore] 
    public ItemChoiceType ItemElementName { get; set; } 

    // ... other serialization methods 
} 

Lorsque je crée instance de la classe de pilote en utilisant Activator I get suivantes objet:

obj.Item = null; 
obj.ItemElementName = "Bit16" 

La propriété ItemElementName est définie par défaut, car son énumération, mais comment définir Item si elle est basée sur cette énumération? Encore une fois, je crée dynamiquement de nombreux objets avec Activator, donc je ne peux pas le coder en dur - il est possible d'obtenir cette information en classe et de créer correctement la propriété Item?

Merci beaucoup!

Répondre

1

ItemElementName est défini sur ItemChoiceType.Bit16 car il s'agit du premier élément de l'énumération. D'où sa valeur est 0 mais vous pouvez le voir comme Bit16. Par Activator vous créez une nouvelle instance. Si vous ne mettez pas d'arguments pour définir vos propriétés, alors leurs valeurs seront celles par défaut.

Je vois que vous avez là XmlChoiceIdentifier et d'autres choses de XmlSerializer. Le but de cet attribut est de:

  1. Ne pas sérialiser la propriété ItemElementName.
  2. Pour restaurer ItemElementName après la désérialisation basée sur la valeur sérialisée de Item.

C'est ce que je peux vous dire basant sur les informations fournies ...

Voici un exemple qui utilise XmlSerializer avec XmlChoiceIdentifier:

public class Choices 
{ 
    [XmlChoiceIdentifier("ItemType")] 
    [XmlElement("Text", Type = typeof(string))] 
    [XmlElement("Integer", Type = typeof(int))] 
    [XmlElement("LongText", Type = typeof(string))] 
    public object Choice { get; set; } 

    [XmlIgnore] 
    public ItemChoiceType ItemType; 
} 

[XmlType(IncludeInSchema = false)] 
public enum ItemChoiceType 
{ 
    Text, 
    Integer, 
    LongText 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     Choices c1 = new Choices(); 
     c1.Choice = "very long text"; // You can put here a value of String or Int32. 
     c1.ItemType = ItemChoiceType.LongText; // Set the value so that its type match the Choice type (Text or LongText due to type of value is string). 

     var serializer = new XmlSerializer(typeof(Choices)); 
     using (var stream = new FileStream("Choices.xml", FileMode.Create)) 
      serializer.Serialize(stream, c1); 

     // Produced xml file. 
     // Notice: 
     // 1. LongText as element name 
     // 2. Choice value inside the element 
     // 3. ItemType value is not stored 
     /* 
     <?xml version="1.0"?> 
     <Choices xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
      <LongText>very long text</LongText> 
     </Choices> 
     */ 

     Choices c2; 
     using (var stream = new FileStream("Choices.xml", FileMode.Open)) 
      c2 = (Choices)serializer.Deserialize(stream); 

     // c2.ItemType is restored 
    } 
} 
Questions connexes