Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

XmlChoiceIdentifierAttribute-Klasse

 

Veröffentlicht: Oktober 2016

Gibt an, dass der Member durch Verwendung einer Enumeration genauer erkannt werden kann.

Namespace:   System.Xml.Serialization
Assembly:  System.Xml (in System.Xml.dll)

System.Object
  System.Attribute
    System.Xml.Serialization.XmlChoiceIdentifierAttribute

[AttributeUsageAttribute(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter | AttributeTargets.ReturnValue, 
	AllowMultiple = false)]
public class XmlChoiceIdentifierAttribute : Attribute

NameBeschreibung
System_CAPS_pubmethodXmlChoiceIdentifierAttribute()

Initialisiert eine neue Instanz der XmlChoiceIdentifierAttribute-Klasse.

System_CAPS_pubmethodXmlChoiceIdentifierAttribute(String)

Initialisiert eine neue Instanz der XmlChoiceIdentifierAttribute-Klasse.

NameBeschreibung
System_CAPS_pubpropertyMemberName

Ruft ab oder legt den Namen des Felds, das die Enumeration zu verwendende Erkennen von Typen zurückgibt.

System_CAPS_pubpropertyTypeId

Ruft bei Implementierung in einer abgeleiteten Klasse einen eindeutigen Bezeichner für dieses Attribute ab.(Geerbt von „Attribute“.)

NameBeschreibung
System_CAPS_pubmethodEquals(Object)

Diese API unterstützt die Produkt Infrastruktur und sollte nicht direkt aus dem Code verwendet werden. Gibt einen Wert zurück, der angibt, ob diese Instanz gleich einem angegebenen Objekt ist.(Geerbt von „Attribute“.)

System_CAPS_protmethodFinalize()

Gibt einem Objekt Gelegenheit, Ressourcen freizugeben und andere Bereinigungen durchzuführen, bevor es von der Garbage Collection freigegeben wird. (Geerbt von „Object“.)

System_CAPS_pubmethodGetHashCode()

Gibt den Hashcode für diese Instanz zurück.(Geerbt von „Attribute“.)

System_CAPS_pubmethodGetType()

Ruft den Type der aktuellen Instanz ab.(Geerbt von „Object“.)

System_CAPS_pubmethodIsDefaultAttribute()

Gibt beim Überschreiben in einer abgeleiteten Klasse an, ob der Wert der Instanz der Standardwert für die abgeleitete Klasse ist.(Geerbt von „Attribute“.)

System_CAPS_pubmethodMatch(Object)

Ruft beim Überschreiben in einer abgeleiteten Klasse gibt einen Wert, der angibt, ob diese Instanz gleich ein angegebenen Objekt ist.(Geerbt von „Attribute“.)

System_CAPS_protmethodMemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.(Geerbt von „Object“.)

System_CAPS_pubmethodToString()

Gibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt.(Geerbt von „Object“.)

NameBeschreibung
System_CAPS_pubinterfaceSystem_CAPS_privmethod_Attribute.GetIDsOfNames(Guid, IntPtr, UInt32, UInt32, IntPtr)

Ordnet eine Reihe von Namen einer entsprechenden Reihe von Dispatchbezeichnern zu.(Geerbt von „Attribute“.)

System_CAPS_pubinterfaceSystem_CAPS_privmethod_Attribute.GetTypeInfo(UInt32, UInt32, IntPtr)

Ruft die Typinformationen für ein Objekt ab, mit deren Hilfe die Typinformationen für eine Schnittstelle abgerufen werden können.(Geerbt von „Attribute“.)

System_CAPS_pubinterfaceSystem_CAPS_privmethod_Attribute.GetTypeInfoCount(UInt32)

Ruft die Anzahl der Schnittstellen mit Typinformationen ab, die von einem Objekt bereitgestellt werden (0 oder 1).(Geerbt von „Attribute“.)

System_CAPS_pubinterfaceSystem_CAPS_privmethod_Attribute.Invoke(UInt32, Guid, UInt32, Int16, IntPtr, IntPtr, IntPtr, IntPtr)

Stellt den Zugriff auf von einem Objekt verfügbar gemachte Eigenschaften und Methoden bereit.(Geerbt von „Attribute“.)

Die XML-Schemaelementdefinition xsi:choice Dient zum Definieren eines komplexen Elements, das nur ein untergeordnetes Element in einer Instanz enthalten kann (Maxoccurs = 1). Dieses untergeordnete Element kann eine von mehreren Typen, und es kann mehrere Namen haben. Jeder Name ist einem bestimmten Typ zugeordnet. Allerdings können mehrere Namen desselben Typs zugeordnet werden. Aus diesem Grund ist eine Instanz eines solchen Elements undeutlich. Betrachten Sie beispielsweise das folgende Schemafragment, die dieses Schemafragment Element mit dem Namen definiert MyChoice.

<xsd:complexType name="MyChoice">
 <xsd:sequence>
 <xsd:choice minOccurs="0" maxOccurs="1">
 <xsd:element minOccurs="1" maxOccurs="1" name="ChoiceOne" type="xsd:string" />
 <xsd:element minOccurs="1" maxOccurs="1" name="ChoiceTwo" type="xsd:string" />
 </xsd:choice>
 </xsd:sequence>
</xsd:complexType>

Die XmlChoiceIdentifierAttribute ermöglicht es Ihnen, jede Instanz des Members einen speziellen Enumerationswert zuzuweisen. Sie müssen die Enumeration selbst erstellen oder sie wird erstellt, indem die XML Schema Definition-Tool (Xsd.exe). Der folgende C#-Code zeigt wie die XmlChoiceIdentifierAttribute gilt für ein Item Feld; die MemberName -Eigenschaft gibt das Feld mit der Enumeration, die die Bestimmung der Auswahl verwendet wird.

public class Choices{
 [XmlChoiceIdentifier("ItemType")]
 [XmlChoiceIdentifier("ChoiceOne")]
 [XmlChoiceIdentifier("ChoiceTwo")]
 public string MyChoice;

 // Do not serialize this next field:
 [XmlIgnore]
 public ItemChoiceType ItemType;
}
// Do not include this enumeration in the XML schema.
[XmlType(IncludeInSchema = false)]
public enum ItemChoiceType{
 ChoiceOne,
 ChoiceTwo,
}

Wenn dieser Code vorhanden ist, können Sie das Serialisieren und Deserialisieren von dieser Klasse durch Festlegen der ItemType Feld auf eine entsprechende Enumeration. Z. B. zum Serialisieren der Choice -Klasse, die C#-Code ähnelt der folgenden Darstellung.

Choices mc = new Choices();
mc.MyChoice = "Item Choice One";
mc.ItemType = ItemChoiceType.ChoiceOne;

Beim Deserialisieren ähnelt der C#-Code Folgendes:

MyChoice mc = (MyChoice) myXmlSerializer.Deserialize(myReader);
if(mc.ItemType == ItemChoiceType.ChoiceOne)
 {
     // Handle choice one.
 }
if(mc.ItemType == ItemChoiceType.ChoiceTwo)
 {
     // Handle choice two.
 }
if(mc.ItemType != null)
 {
     throw CreateUnknownTypeException(mc.Item);
 }

Es ist ein zweites Szenario bei der XmlChoiceIdentifierAttribute verwendet wird. Im folgenden Schema ist der Member ein Feld, das ein Array von Elementen zurückgibt (MaxOccurs = "unbounded"). Das Array kann Objekte der ersten Auswahl enthalten ("D-a-t-a"), und der zweiten Auswahl ("MoreData").

<xsd:complexType name="MyChoice">
 <xsd:sequence>
 <xsd:choice minOccurs="0" maxOccurs="unbounded">
 <xsd:element minOccurs="1" maxOccurs="1" name="D-a-t-a" type="xsd:string" />
 <xsd:element minOccurs="1" maxOccurs="1" name="MoreData" type="xsd:string" />
 </xsd:choice>
 </xsd:sequence>
</xsd:complexType>

Die resultierende Klasse verwendet dann ein Feld, um ein Array von Elementen zurückzugeben. Für jedes Element im Array, eine entsprechende ItemChoiceType Enumeration muss auch vorhanden sein. Die entsprechenden Enumerationen sind in den zurückgegebenen Array enthalten die ItemsElementName Feld.

public class MyChoice {
 [System.Xml.Serialization.XmlElementAttribute("D-a-t-a", typeof(string), IsNullable=false)]
 [System.Xml.Serialization.XmlElementAttribute("MoreData", typeof(string), IsNullable=false)]
 [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemsElementName")]
 public string[] Items;
 [System.Xml.Serialization.XmlElementAttribute(IsNullable=false)]
 [System.Xml.Serialization.XmlIgnoreAttribute()]
 public ItemsChoiceType[] ItemsElementName;
}
[System.Xml.Serialization.XmlTypeAttribute(IncludeInSchema=false)]
public enum ItemsChoiceType {
 [System.Xml.Serialization.XmlEnumAttribute("D-a-t-a")]
 Data,
 MoreData,
}

Beim Deserialisieren eines Objekts, das eine Palette von Wahlmöglichkeiten enthält, verwenden Sie eine (z. B. eine If...... else-Struktur) bestimmen, wie ein bestimmter Wert deserialisiert. Überprüfen Sie in der Struktur des Steuerelements den Enumerationswert und Deserialisieren Sie den Wert entsprechend.

Im folgenden Beispiel wird die Klasse serialisiert Choices enthält zwei Felder, MyChoice und ManyChoices. Die XmlChoiceIdentifierAttribute gilt für jedes Feld, das angibt (über die MemberName Eigenschaft) einen anderen Klassenmember, die eine Enumeration, die den Memberwert bestimmt abruft oder festlegt. Die MyChoice Feld kann auf einen einzelnen Wert festgelegt werden, mit einem entsprechenden Enumerationsmember aus dem EnumType Feld. Das ManyChoices -Feld gibt ein Array von Objekten zurück. Das ChoiceArray -Feld gibt ein Array von Enumerationswerten zurück. Für jeden Arraymember in die ManyChoices Feld, ein entsprechenden Member gefunden in das zurückgegebene Array die ChoiceArray Feld.

using System;
using System.Xml;
using System.Xml.Serialization;
using System.IO;

public class Choices{
   // The MyChoice field can be set to any one of 
   // the types below. 
   [XmlChoiceIdentifier("EnumType")]
   [XmlElement("Word", typeof(string))]
   [XmlElement("Number", typeof(int))]
   [XmlElement("DecimalNumber", typeof(double))]
   public object MyChoice;

   // Don't serialize this field. The EnumType field
   // contains the enumeration value that corresponds
   // to the MyChoice field value.
   [XmlIgnore]
   public ItemChoiceType EnumType;

   // The ManyChoices field can contain an array
   // of choices. Each choice must be matched to
   // an array item in the ChoiceArray field.
   [XmlChoiceIdentifier("ChoiceArray")]
   [XmlElement("Item", typeof(string))]
   [XmlElement("Amount", typeof(int))]
   [XmlElement("Temp", typeof(double))]
   public object[] ManyChoices;

   // TheChoiceArray field contains the enumeration
   // values, one for each item in the ManyChoices array.
   [XmlIgnore]
   public MoreChoices[] ChoiceArray;
}

[XmlType(IncludeInSchema=false)]
public enum ItemChoiceType{
   None,
   Word, 
   Number,
   DecimalNumber
}

public enum MoreChoices{
   None,
   Item,
   Amount,
   Temp
}

public class Test{
   static void Main(){
      Test t = new Test();
      t.SerializeObject("Choices.xml");
      t.DeserializeObject("Choices.xml");
   }

   private void SerializeObject(string filename){
      XmlSerializer mySerializer = 
      new XmlSerializer(typeof(Choices));
      TextWriter writer = new StreamWriter(filename);
      Choices myChoices = new Choices();

      // Set the MyChoice field to a string. Set the
      // EnumType to Word.
      myChoices.MyChoice= "Book";
      myChoices.EnumType = ItemChoiceType.Word;

      // Populate an object array with three items, one
      // of each enumeration type. Set the array to the 
      // ManyChoices field.
      object[] strChoices = new object[]{"Food",  5, 98.6};
      myChoices.ManyChoices=strChoices;

      // For each item in the ManyChoices array, add an
      // enumeration value.
      MoreChoices[] itmChoices = new MoreChoices[]
      {MoreChoices.Item, 
      MoreChoices.Amount,
      MoreChoices.Temp};
      myChoices.ChoiceArray=itmChoices;

      mySerializer.Serialize(writer, myChoices);
      writer.Close();
   }

   private void DeserializeObject(string filename){
      XmlSerializer ser = new XmlSerializer(typeof(Choices));

      // A FileStream is needed to read the XML document.
      FileStream fs = new FileStream(filename, FileMode.Open);
      Choices myChoices = (Choices)
      ser.Deserialize(fs);
      fs.Close();

      // Disambiguate the MyChoice value using the enumeration.
      if(myChoices.EnumType == ItemChoiceType.Word){
      	   Console.WriteLine("Word: " +  
      	   	myChoices.MyChoice.ToString());
      	}
      else if(myChoices.EnumType == ItemChoiceType.Number){
      	   Console.WriteLine("Number: " +
      	   	myChoices.MyChoice.ToString());
      	}
      else if(myChoices.EnumType == ItemChoiceType.DecimalNumber){
      	   Console.WriteLine("DecimalNumber: " +
      	   	myChoices.MyChoice.ToString());
      	}

      // Disambiguate the ManyChoices values using the enumerations.
      for(int i = 0; i<myChoices.ManyChoices.Length; i++){
      if(myChoices.ChoiceArray[i] == MoreChoices.Item)
      	Console.WriteLine("Item: " + (string) myChoices.ManyChoices[i]);
      else if(myChoices.ChoiceArray[i] == MoreChoices.Amount)
      	Console.WriteLine("Amount: " + myChoices.ManyChoices[i].ToString());
      if(myChoices.ChoiceArray[i] == MoreChoices.Temp)
      	Console.WriteLine("Temp: " + (string) myChoices.ManyChoices[i].ToString());
      	}

   }
}

Universelle Windows-Plattform
Verfügbar seit 8
.NET Framework
Verfügbar seit 1.1
Portierbare Klassenbibliothek
Unterstützt in: portierbare .NET-Plattformen
Silverlight
Verfügbar seit 2.0
Windows Phone Silverlight
Verfügbar seit 7.0
Windows Phone
Verfügbar seit 8.1

Alle öffentlichen statischen Member ( Shared in Visual Basic) dieses Typs sind threadsicher. Die Threadsicherheit für Instanzmember ist nicht garantiert.

Zurück zum Anfang
Anzeigen: