Hallo,
ich möchte einer Eigenschaft eines Objekts einen Wert zuweisen.
Identifiziert wird die Eigenschaft über einen String.
So in der Art:
SetPropertyValue(Objekt, "Text", "Das ist der Wert")
Hat jemand eine Idee?
Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)
Suche mal nach PropertyInfo
Edit: Nachtrag.... noch schnell ein Sample nachgeschoben 😉
private void button1_Click(object sender, System.EventArgs e)
{
//Mit konvertierung (von int zu string)
SetPropertyInfo(this,"Text",5);
//ohne Konvertierung
SetPropertyInfo(this,"Text","Juhu es funzt");
}
private static bool SetPropertyInfo(object pTarget, string pPropertyName, object pValue)
{
bool ret=false;
System.Reflection.PropertyInfo pi=pTarget.GetType().GetProperty(pPropertyName);
if (pi!=null)
{
Type typValue=pValue.GetType();
if (pi.PropertyType==typValue)
{
//Type stimmt
pi.SetValue(pTarget,pValue,new object[]{});
ret=true;
}
else
{
//Type konvertieren
pi.SetValue(pTarget,Convert.ChangeType(pValue,pi.PropertyType),new object[]{});
ret=true;
}
}
return ret;
}
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...
Hallo Garby,
mir ist nicht ganz klar geworden, warum und wozu du das machen willst. Je nachdem käme - wie vorgeschlagen - PropertyInfo oder aber auch ein Dictonary (Hashtable) in Betracht.
herbivore
@herbivore:
Es gibt schon Situationen, wo sowas sinnvoll ist. Bei Plug-ins z.B. gibt es meist immer nur eine feste Schnittstelle mit genau definierten Funktionen. Soll das Plug-in noch über weitere Eigenschaften verfügen, die in der Schnittstelle nicht definiert sind, dann kommt man um Reflection kaum rum.
Du wolltest hier ein Dictionary/Hash vorschlagen aber das ist manchmal aus Performance-Gründen nicht sinnvoll, weil direkter Variablenzugriff im Code schneller ist:
int i = (int)hash["myVar"];
vs.
int i = myVar;
Voraussetzung ist natürlich, dass das Property sehr selten aufgerufen wird, dafür aber die interne Variable, die dem Property zugeordnet ist, sehr intensiv.
I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.
Original von maxE
@herbivore:
Es gibt schon Situationen, wo sowas sinnvoll ist. Bei Plug-ins z.B. gibt es meist immer nur eine feste Schnittstelle mit genau definierten Funktionen. Soll das Plug-in noch über weitere Eigenschaften verfügen, die in der Schnittstelle nicht definiert sind, dann kommt man um Reflection kaum rum.
Des versteh ich grad net ganz. Das ist doch grad der Sinn von Interfaces, dass du eine spezielle Schnittstelle hast, über die du dein Plugin ansprichst. Mehr musst du vom Typ nicht kennen. Wenn du jetzt wieder versuchst andere Properties zu setzen, verwäscht du doch dein eigenes Interface Konzept.
Baka wa shinanakya naoranai.
Mein XING Profil.
Hallo maxE,
Es gibt schon Situationen, wo sowas sinnvoll ist.
das habe ich ja nicht bezweifelt.
Du wolltest hier ein Dictionary/Hash vorschlagen aber das ist manchmal aus Performance-Gründen nicht sinnvoll, weil direkter Variablenzugriff im Code schneller ist:
Ein Hash-Zugriff ist heutzutage in der Regel schnell genug. Ich habe eine komplette Lastschrift-Anwendung geschrieben, bei der für jeden Property-Zugriff nicht nur auf mehrere Hashtables zugegriffen wurde, sondern noch diverse Prüfungen durchgeführt wurden, teilweise inkl. Substring-Operationen auf den Attributnamen. Keinerlei Performace-Probleme.
Davon abgesehen habe ich hier nicht Dictionary als Lösung vorschlagen, sondern gerade nur geschrieben, dass es in Betracht käme. 🙂
herbivore
Original von herbivore
Ein Hash-Zugriff ist heutzutage in der Regel schnell genug. Ich habe eine komplette Lastschrift-Anwendung geschrieben, bei der für jeden Property-Zugriff nicht nur auf mehrere Hashtables zugegriffen wurde, sondern noch diverse Prüfungen durchgeführt wurden, teilweise inkl. Substring-Operationen auf den Attributnamen. Keinerlei Performace-Probleme.
Sicher, für die Lastschriftanwendung ist das OK. Für die Anwendungen an den ich mitgearbeitet habe ist das aber nicht sehr praktikabel. Auf Variablen/Properties - anfänglich einmal über Refl. initialisiert - muss hier mehrere tausend mal pro Sekunde zugegriffen werden. Da sind mir "normale" Variablen/Properties, lieber als Hashtabellen, die als Variablencontainer fungieren 😉
I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.
Hallo maxE,
so hat halt jeder seinen Background und seine Erfahrungen. Ich hoffe du bist mir nicht böse, wenn ich sage, dass sich in dieser Beziehung meine Erfahrungen vermutlich eher verallgemeinern lassen als deine.
herbivore
Danke Hans, dein Beispiel ist genau das was ich wollte.
@herbivore:
Ich habe eine statische Klasse, die die Oberflächentexte der Anwendung aus einer DB liest, und dann direkt in die Properties der einzelnen Objekte schreibt, wenn der User eine andere Sprache auswählt.
Ich hatte das eigentlich fix fertig über BindingList gelöst. Das war einerseits zu Unflexibel, z.B. wenn der Text noch manipuliert werden soll, und andererseits hatte ich ein Problem mit einer Fremdkomponente, die den Text nur änderte wenn sie gerade im Vordergrund war.
Meine neue Klasse hält eine Liste der Objekte mit Properties. Beim Laden jedes Objekts wird dieser Liste ein Eintrag hinzugefügt und sofort der Wert gesetzt. Ändert sich die Sprache, wird die ganze Liste abgearbeitet.
Diese Lösung ist imo übersichtlicher und flexibler als das BindingList-Konzept.
Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)
Hallo Garby,
ich denke, für diesen Fall bist du mit der Methode von Programmierhans wirklich gut bedient.
herbivore
Original von herbivore
Hallo maxE,so hat halt jeder seinen Background und seine Erfahrungen. Ich hoffe du bist mir nicht böse, wenn ich sage, dass sich in dieser Beziehung meine Erfahrungen vermutlich eher verallgemeinern lassen als deine.
herbivore
Wie schon gesagt: Jeder hat seinen Background und außerdem kommt es auf den Anwendungsfall an. Für viele Anwendungen sind solche Überlegungen ausreichen, da die Performance meist nicht so eine große Rolle spielt. Ich hätte es wahrscheinlich oft auch so gemacht wie du, aber ich kenne Situationen bei denen es manchmal sehr sinnvoll ist über Reflection zu gehen und den Overhead einer Hashtabelle zu meiden ...
Na ja, lassen wir's gut sein 😉
I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.
Original von Garby
Ich habe eine statische Klasse, die die Oberflächentexte der Anwendung aus einer DB liest, und dann direkt in die Properties der einzelnen Objekte schreibt, wenn der User eine andere Sprache auswählt.
Für so was hätte ich (habe ich auch 🙂) mir eher einen IExtenderProvider geschrieben.... aber hauptsache es funzt
Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...