2016-04-20 10 views
2

Zum Beispiel hat ich eine einfache KlasseListe alle Eigenschaften mit [XmlAttribute] der gegebenen Klasse

class SomeCfg 
{ 
    [XmlAttribute("ArchivePath")] 
    public string ArchivePath { get; set; } 
} 

Wie gegebene Klasse gesehen werden kann, hat eine Eigenschaft mit Xml Attribute. Aber wenn die Ausführung Programm zu diesem Code kommt

var t = typeof (SomeCfg); 
var props = t.GetProperties().Where(
    prop => Attribute.IsDefined(prop, typeof(XmlAttribute))); 

Runtime wirft Ausnahme

System.ArgumentException: Type passed in must be derived from System.Attribute or System.Attribute itself. 

Natürlich, wenn ich Typen Hierarchie sah ich erkennen, dass es wahr ist (ich will nicht gehen in warum dies erbt nicht von dieser Klasse).

Meine Frage ist, wie Sie diese Eigenschaften auflisten (Erstellen einer Klasse, die von XmlAttribute erbt und System.Attribute ist in diesem Fall keine Option).

Nach Frage-Tag .Net-Version ist 4.0.

+0

was ist ** t **? –

+0

Sorry, natürlich fehlt diese Zeile. Ich habe die Frage korrigiert. –

Antwort

3

Ist es möglich, dass Sie System.Xml.XmlAttribute anstelle von System.Xml.Serialization.XmlAttributeAttribute verwendet haben?

System.Xml.XmlAttribute wird verwendet, um ein Attribut aus dem XML-Dokument darzustellen. System.Xml.Serialization.XmlAttributeAttribute gibt an, dass der XmlSerializer das Klassenmitglied als XML-Attribut serialisieren muss.

+0

Ja, die Zeile mit dem Attribut Abfrage wie diese var Requisiten = t.GetProperties aussehen sollte(). Wo ( \t \t \t \t prop => Attribute.IsDefined (prop, typeof (XmlAttributeAttribute))) –

1

Sie Eigenschaften enthält, erhalten können XmlAttribute aus folgenden Code ..

var props = t.GetProperties() 
      .Where(prop => 
       prop.GetCustomAttributes(typeof(XmlAttributeAttribute), false).Any(PropType => PropType.GetType() == typeof(XmlElementAttribute) || 
                 PropType.GetType() == typeof(XmlAttributeAttribute))); 

wenn Sie nicht wollen, voll LINQ verwenden, dann ist dieser Beitrag ist auch für Sie hilfreich.

Serialize all properties in a class as attributes instead of elements