2013-05-26 4 views
1

я создаю объекты динамически с помощью Activator (C#) и один из этих классов выглядит следующим образом:Создание объекта на основе 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 
} 

Когда я создаю экземпляр класса Driver с помощью Активатор я получаю следующий объект:

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

ItemElementName устанавливается по умолчанию, потому что его перечисление, но как установить элемент, если он основан на этом перечислении? Еще раз, я создаю много объектов динамически с помощью Activator, поэтому я не могу его жестко определить - возможно ли получить эту информацию в классе и правильно создать свойство Item?

Большое спасибо!

ответ

1

ItemElementName установлен в ItemChoiceType.Bit16, потому что это первый элемент в перечислении. Следовательно, его значение равно 0, но вы можете увидеть это как Bit16. К Activator вы создаете новый экземпляр. Если вы не ставите аргументы, чтобы установить свои свойства, то их значения будут по умолчанию.

Я вижу, что у вас есть XmlChoiceIdentifier и другие материалы XmlSerializer. Цель этого атрибута заключается в следующем:

  1. Не сериализуйте ItemElementName.
  2. Для восстановления ItemElementName после десериализации на основе сериализованного значения Item.

Вот что я могу сказать вам, основываясь на предоставленной информации ...

Вот пример, который использует XmlSerializer вместе с 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 
    } 
} 
Смежные вопросы