Laden...

Anonyme Property setzen

Erstellt von Garby vor 18 Jahren Letzter Beitrag vor 18 Jahren 3.197 Views
Garby Themenstarter:in
95 Beiträge seit 2006
vor 18 Jahren
Anonyme Property setzen

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)

4.221 Beiträge seit 2005
vor 18 Jahren

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...

49.485 Beiträge seit 2005
vor 18 Jahren

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

M
456 Beiträge seit 2004
vor 18 Jahren

@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.

6.862 Beiträge seit 2003
vor 18 Jahren

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.

49.485 Beiträge seit 2005
vor 18 Jahren

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

M
456 Beiträge seit 2004
vor 18 Jahren

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.

49.485 Beiträge seit 2005
vor 18 Jahren

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

Garby Themenstarter:in
95 Beiträge seit 2006
vor 18 Jahren

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)

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo Garby,

ich denke, für diesen Fall bist du mit der Methode von Programmierhans wirklich gut bedient.

herbivore

M
456 Beiträge seit 2004
vor 18 Jahren

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.

4.221 Beiträge seit 2005
vor 18 Jahren

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...