2008-12-24 10 views
18

Ich versuche ein Objekt durch ein Attribut für ein Klassen-Eigenschaft zu bauen, die eine Spalte in einem zugeführten Datenzeile angibt, dass der Wert der Eigenschaft ist, wie folgt:C# Einstellung Eigenschaftswerte durch Reflexion mit Attributen

[StoredDataValue("guid")] 
    public string Guid { get; protected set; } 

    [StoredDataValue("PrograGuid")] 
    public string ProgramGuid { get; protected set; } 

in einem Build() -Methode auf einem Basisobjekt, erhalte ich die Attributwerte setzen auf diesen Eigenschaften als

 MemberInfo info = GetType(); 
     object[] properties = info.GetCustomAttributes(true); 

jedoch an dieser Stelle ich die Beschränkung in meinem Wissen bin zu realisieren.

Zunächst einmal scheint ich nicht die richtigen Attribute zurück zu bekommen.

Und wie setze ich diese Eigenschaften durch Reflexion, jetzt, wo ich die Attribute habe? Mache/denke ich etwas grundsätzlich falsch?

Antwort

38

Es gibt ein paar verschiedene Dinge hier

  • typeof(MyClass).GetCustomAttributes(bool) (oder GetType().GetCustomAttributes(bool)) die Attribute für die Klasse zurückgibt selbst, nicht die Attribute für Mitglieder. Sie müssen typeof(MyClass).GetProperties() aufrufen, um eine Liste der Eigenschaften in der Klasse abzurufen, und sie dann überprüfen.

  • Sobald Sie die Eigenschaft, ich denke, Sie sollten Attribute.GetCustomAttribute() anstelle von MemberInfo.GetGustomAttributes() verwenden, da Sie genau wissen, welches Attribut Sie suchen.

Hier ist ein kleiner Code-Schnipsel, Sie zu helfen starten:

PropertyInfo[] properties = typeof(MyClass).GetProperties(); 
foreach(PropertyInfo property in properties) 
{ 
    StoredDataValueAttribute attribute = 
     Attribute.GetCustomAttribute(property, typeof(StoredDataValueAttribute)) as StoredDataValueAttribute; 

    if (attribute != null) // This property has a StoredDataValueAttribute 
    { 
     property.SetValue(instanceOfMyClass, attribute.DataValue, null); // null means no indexes 
    } 
} 

EDIT: Vergessen Sie nicht, dass Type.GetProperties() nur öffentliche Eigenschaften standardmäßig zurück. Sie müssen Type.GetProperties(BindingFlags) verwenden, um auch andere Arten von Eigenschaften zu erhalten.

+0

Ich werde das einen Test geben und Sie wissen lassen, sieht logisch aus – johnc

+0

Attribut.GetCustomAttribute (...) gibt ein Array von System.Attribute zurück und kann nicht einfach in das Attribut selbst umgewandelt werden. Das gezeigte Beispiel lässt sich gar nicht erst kompilieren, geschweige denn arbeiten. Sie müssen die Array-Länge testen, um festzustellen, ob das gewünschte Attribut vorhanden ist, und stattdessen das erste Element in den gewünschten Typ umwandeln. –

+0

Das Beispiel verwendet GetCustomAttribute, nicht GetCustomAttributes. Das Beispiel kompiliert, wenn ich es versuche (natürlich den Attributnamen ändern). –

Verwandte Themen