Objekte mit dynamischen Properties in C#

In Javascript kann man neben der herkömlichen Methode myobject.FirstName auf die Properties eines Objektes auch mittels myobject[„FirstName“] zugreifen. „Firstname“ kann dabei auch eine Variable sein, was z.B. bei einer localisierten Ausgabe sehr praktisch ist.

var myPropertyName = „Firstname“;
myobject[myPropertyName];

VB kennt ebenfalls eine solche Möglichkeit: myobject.(„FirstName“), bzw. auf das obige Beispiel angewendet: myobject.(myPropertyName).

In C# beißt man sich dagegen allerdings die Zähne aus, versucht man dort dynamisch auf die Properties eines Objektes zuzugreifen, fällt der Debugger auf die Nase. Mit einem kleinen Trick mittels IObjectHelper Members geht´s allerdings doch:

public class myObject
{
   private string Firstname;
   private string property_de;
   private string property_en;

public string Property;
{
   get { return this.firstname; }
   set { this.firstname = value; }
}

public string Property_de;
{
   get { return this.property_de; }
   set { this.property_de = value; }
}

public string Property_en;
{
   get { return this.property_en; }
   set { this.property_en = value; }
}
#region IObjectHelper Members
public object this[string memberName]
{
   get {
      switch (memberName) {
         case „firstname“: return this.firstname;
         case „property_de“: return this.property_de;
         case „property_en“: return this.property_en;
         default: throw new Exception(„Invalid Member“);
}
}
set {
      switch (memberName) {
         case „firstname“: this.firstname = (string) value; break;
         case „property_de“: this.property_de = (string) value; break;
         case „property_en“: this.property_en = (string) value; break;
         default: throw new Exception(„Invalid Member“);
      }
   }
}

Nun kann man auch in C# einfach via myObject[„firstname“] zugreifen. Ok, vielleicht noch nichts besonderes, interessant wird es, wenn man z.B. auf ein sprachabhängiges Property zugreifen möchte:

string lang = „de“;
myObject[„property_“+lang];

Probiert und gestestet ist das Ganze übrigends unter .Net 1.1. Ob die neue Version 8.0 von C# in .Net 2.0 eine Möglichkeit mitbringt, dynamisch auf Properties zuzugreifen, kann ich IMO nicht sagen.

5 thoughts on “Objekte mit dynamischen Properties in C#

  1. Im Prinzip könnte ich das ganze doch aber auch ohne den Einsatz von IObjectHelper implementieren – halt als Indexer mit String-Parameter, oder?

    Weiterhin gehört ja IObjectHelper – wenn ich mich nicht irre – in den Bereich ADO .NET. Und zwar in das Object Persistence Framework, welches eigentlich die Brücke zwischen Objektpersistenz und relationalen Datenbanken schlagen soll. Demzufolge wäre der Einsatz des Interfaces für o.g. Zwecke meiner Meinung nach stilistisch nicht sehr schön :-)

    Und so, wie es aussieht, ist IObjectHelper letztendlich auch aus dem 2.0er Framework verschwunden. Zumindest ist das Interface weder in der aktuellen MSDN, noch im Object Browser vom VS 2005 zu finden. Und die Jungs von WinFX247 berichten auch, dass sie es zum letzen Mal im Framework v1.1.4322 gesehen haben ( www.winfx247.com/247reference/system/data/objectspaces/iobjecthelper/__members ).

  2. Denke Jens meint per CultureInfo, aber das trifft das ganze leider überhaupt nicht.

    Aber hast recht Rene, es taucht tatsächlich nicht mehr auf :( hab zwar bei Koders was diesbezüglich gefunden aber na ja … Muss ich wohl noch etwas mit Indexern rumspielen :)

Comments are closed.