Exportieren (0) Drucken
Alle erweitern
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original

XmlChoiceIdentifierAttribute-Klasse

Gibt an, dass der Member durch Verwenden einer Enumeration eindeutig bestimmt werden kann.

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

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

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

Der XmlChoiceIdentifierAttribute-Typ macht die folgenden Member verfügbar.

  NameBeschreibung
Öffentliche MethodeUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsXmlChoiceIdentifierAttribute()Initialisiert eine neue Instanz der XmlChoiceIdentifierAttribute-Klasse.
Öffentliche MethodeUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsXmlChoiceIdentifierAttribute(String)Initialisiert eine neue Instanz der XmlChoiceIdentifierAttribute-Klasse.
Zum Seitenanfang

  NameBeschreibung
Öffentliche EigenschaftUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsMemberNameRuft den Namen des Felds ab, das die Enumeration zurückgibt, mit der Typen bestimmt werden, oder legt diesen fest.
Öffentliche EigenschaftTypeIdBei Implementierung in einer abgeleiteten Klasse wird ein eindeutiger Bezeichner für dieses Attribute abgerufen. (Von Attribute geerbt.)
Zum Seitenanfang

  NameBeschreibung
Öffentliche MethodeUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsEqualsInfrastruktur. Gibt einen Wert zurück, der angibt, ob diese Instanz gleich einem angegebenen Objekt ist. (Von Attribute geerbt.)
Geschützte MethodeUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsFinalize Gibt einem Objekt Gelegenheit, Ressourcen freizugeben und andere Bereinigungen durchzuführen, bevor es von der Garbage Collection freigegeben wird. (Von Object geerbt.)
Öffentliche MethodeUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsGetHashCodeGibt den Hashcode für diese Instanz zurück. (Von Attribute geerbt.)
Öffentliche MethodeUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsGetTypeRuft den Type der aktuellen Instanz ab. (Von Object geerbt.)
Öffentliche MethodeIsDefaultAttributeBeim Überschreiben in einer abgeleiteten Klasse wird angegeben, ob der Wert dieser Instanz der Standardwert für die abgeleitete Klasse ist. (Von Attribute geerbt.)
Öffentliche MethodeUnterstützt von XNA FrameworkMatchBeim Überschreiben in einer abgeleiteten Klasse wird ein Wert zurückgegeben, der angibt, ob diese Instanz einem bestimmten Objekt entspricht. (Von Attribute geerbt.)
Geschützte MethodeUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsMemberwiseCloneErstellt eine flache Kopie des aktuellen Object. (Von Object geerbt.)
Öffentliche MethodeUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsToStringGibt eine Zeichenfolge zurück, die das aktuelle Objekt darstellt. (Von Object geerbt.)
Zum Seitenanfang

  NameBeschreibung
Explizite SchnittstellenimplementierungPrivate Methode_Attribute.GetIDsOfNamesOrdnet eine Reihe von Namen einer entsprechenden Reihe von Dispatchbezeichnern zu. (Von Attribute geerbt.)
Explizite SchnittstellenimplementierungPrivate Methode_Attribute.GetTypeInfoRuft die Typinformationen für ein Objekt ab, mit deren Hilfe die Typinformationen für eine Schnittstelle abgerufen werden können. (Von Attribute geerbt.)
Explizite SchnittstellenimplementierungPrivate Methode_Attribute.GetTypeInfoCountRuft die Anzahl der Schnittstellen mit Typinformationen ab, die von einem Objekt bereitgestellt werden (0 oder 1). (Von Attribute geerbt.)
Explizite SchnittstellenimplementierungPrivate Methode_Attribute.InvokeStellt den Zugriff auf von einem Objekt verfügbar gemachte Eigenschaften und Methoden bereit. (Von Attribute geerbt.)
Zum Seitenanfang

Die XML-Schemaelementdefinition xsi:choice wird zum Definieren eines komplexen Elements verwendet, das nur ein untergeordnetes Element in einer Instanz enthalten kann (maxoccurs = 1). Dieses untergeordnete Element kann einen Typ aus einer Auswahl von Typen und einen Namen aus einer Auswahl von Namen aufweisen. Jeder Name ist einem bestimmten Typ zugeordnet. Einem Typ können jedoch mehrere Namen zugeordnet werden. Eine Instanz eines solchen Elements ist deshalb nicht eindeutig. Beachten Sie z. B. folgendes Schemafragment, das ein solches nicht eindeutiges Element mit dem Namen MyChoice definiert.

 <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>

Das XmlChoiceIdentifierAttribute ermöglicht es Ihnen, jeder Instanz des Members einen speziellen Enumerationswert zuzuweisen. Sie können die Enumeration selbst erstellen, sie kann aber auch von XML Schema Definition-Tool (Xsd.exe) generiert werden. Der folgende C#-Code zeigt, wie das XmlChoiceIdentifierAttribute auf ein Item-Feld angewendet wird. Die MemberName-Eigenschaft gibt das Feld mit der Enumeration an, die für 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 diese Klasse serialisieren und deserialisieren, indem Sie das ItemType-Feld auf eine entsprechende Enumeration festlegen. Zum Serialisieren der Choice-Klasse ähnelt der C#-Code z. B. dem folgenden Code:

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

Zum Deserialisieren ähnelt der C#-Code z. B. folgendem Code:

 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);
  }

Für die Verwendung von XmlChoiceIdentifierAttribute ist ein zweites Szenario vorhanden. Im folgenden Schema ist der Member ein Feld, das ein Array von Elementen zurückgibt (maxOccurs="unbounded"). Das Array kann Objekte der ersten Auswahl ("D-a-t-a") und der zweiten Auswahl ("MoreData") enthalten.

 <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 erhaltene Klasse verwendet dann ein Feld, um ein Array von Elementen zurückzugeben. Für jedes Element im Array muss auch eine entsprechende ItemChoiceType-Enumeration vorhanden sein. Die entsprechenden Enumerationen sind in dem Array enthalten, das vom ItemsElementName-Feld zurückgegeben wird.

 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 mit einer größeren Auswahl verwenden Sie eine Steuerstruktur (z. B. eine if...then...else-Struktur), um festzulegen, wie ein bestimmter Wert deserialisiert wird. Überprüfen Sie in der Steuerstruktur den Enumerationswert, und deserialisieren Sie den Wert entsprechend.

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


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());
      	}

   }
}


.NET Framework

Unterstützt in: 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Unterstützt in: 4, 3.5 SP1

Portable Klassenbibliothek

Unterstützt in: Portable Klassenbibliothek

.NET für Windows Store-Apps

Unterstützt in: Windows 8

.NET für Windows Phone-Apps

Unterstützt in: Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core-Rolle wird nicht unterstützt), Windows Server 2008 R2 (Server Core-Rolle wird mit SP1 oder höher unterstützt; Itanium wird nicht unterstützt)

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.

Alle öffentlichen static (Shared in Visual Basic)-Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2015 Microsoft