Referenzen auf Eigenschaften übergeben?



  • Hallo,
    ich habe eine Klasse, die mehrere Eigenschaften besitzt, also etwa so:

    class ClassA
    {
      public int m_n1
      {
         get { return m_n1; }
         set { m_n1 = value; }
      }
      public int m_n2
      {
         get { return m_n2; }
         set { m_n2 = value; }
      }
      public string m_s1
      {
         get { return m_s1; }
         set { m_s1 = value; }
      }
    }
    

    Jetzt möchte ich die Membervariablen m_n1, m_n2, m_s1 in einem DataGridView darstellen und vom Nutzer editierbar machen. Dazu würde ich an die Eigenschaft "Tag" der einzelnen Grid-Zellen gerne eine Referenz auf die Membervariablen übergeben, sodass die CellEndEdit-Methode des DataGridViews selbst weiß, wo die aktualisierten Daten der aktuellen Zelle hingeschrieben werden sollen.

    Leider kann man aber keine Referenzen auf Eigenschaften oder Indexer übergeben. Mit delegates sieht es ähnlich aus.

    Gibt es dennoch einen Weg, ohne an ClassA herumzuschreiben bzw. einen Adapter/Wrapper für ClassA schreiben zu müssen? Das wäre ungünstig, da ClassA aus einem XML-Schema erzeugt wird, dass sich mitunter mal ändert und ein solches Gebastel dann wohl einen höheren Wartungsaufwand bedeuten würde.

    Gruß, Thomas



  • Du kannst den Namen übergeben und mit Reflection auf die Eigenschaft zugreifen.

    typeof(ClassA).GetProperty("NameDerEigentschaft").SetValue(deinObjectVonClassA,DerWerFürDieEigentschaft,null)
    


  • Ich habe leider nie mit gearbeitet und kann daher nicht sagen, ob folgender Hinweis etwas bringt.

    Eventuell bringt die Implementierung von IBindingList eine saubere Anbindung an das GridView.



  • Danke für die Tips.
    Mit Reflection klappts wirklich super, allerdings muss man da bei Modelländerungen höllisch aufpassen, da zur Compilezeit nicht geprüft werden kann, ob eine Eigenschaft mit dem angegebenen Name überhaupt existiert.



  • Vergiss es ich habe compilezeit überlesen.

    PropertyInfo p_info = typeof(ClassA).GetProperty("NameDerEigentschaft");
    if(p_info != null)
    {
     p_info.SetValue(deinObjectVonClassA,DerWerFürDieEigentschaft,null)
    }
    else
    {
     //Eigenschaft nicht vorhanden
    }
    

Anmelden zum Antworten