Kann man ein Eigenschaftsfeld einer Klasse als Argument einer Methode übergeben?
-
Hallo, wenn ich in einer Klasse mit Eigenschaften arbeite, ist es dann möglich die Eigenschaft als Argument in einer Methode zu verwenden? Wenn ja, wie lege ich diesen Platzhalter für die Prototypmethode in den Klammern an?
Habe schon in sämtlichen Unterlagen gewühlt doch nichts brauchbares gefunden.Gruß
moehrle
-
Hi,
es ist nicht ganz klar was Du meinst. Willst Du die Eigenschaft ans sich übergeben (PropertyInfo)? Willst Du den Wert einer Eigenschaft übergen?
Mach am besten ein Beispiel.
-
public class ClassDatenprüfung { private double werkzeugdurchmesser; private double messtiefe; public double Werkzeugdurchmesser { get { return werkzeugdurchmesser; } set { werkzeugdurchmesser = value;} } public double Messtiefe { get { return messtiefe; } set { messtiefe = value;} } /* Methode für die Übergabe der Eingabe in die TextBox in der Eingabemaske. Hier soll geprüft werden, ob die Eingabe für die BErechnung auch tatsächlich erforderlich ist. Das muss für jede Eigenschaft der Klasse passieren. Leider habe ic hin meiner Klasse 30 Eigenschaften, und diese möchte ich dann in der MEthode als Argument übergeben. */ /// <summary> /// Übergabe des Textboxinhaltes an die Klassenigenschaft. /// </summary> /// <param name="?">Platzhalter für die Porperty (Eigenschaft) der Klasse</param> /// <param name="tbx">Inhalt der Textbox die übergeben werden soll.</param> /// <param name="pflichteingabe">if set to <c>true</c> [pflichteingabe].</param> /// <remarks> Mit der boolschen Variable "pflichteingabe" wird geprüft, ob die textbox eine optionale Eingabe oder ein Pflichteingabefeld ist</remarks> private void ÜbergabeEigenschaft(Klasseneigenschaft, TextBox tbx, bool pflichteingabe) { if(pflichteingabe && (tbx.Text != "")) tbx.Text = "----"; else { Klasseneigenschaft = Convert.ToDouble(tbx.Text); } }
Ich denke so ist mein Problem genauer beschrieben.
-
- uebergib am besten nicht direkt die textbox, uebergib lieber direkt den string (dann bleibst du unabhaengig woher der text kommt)
- du kannst mit out angeben das ein parameter wert als ausgabe benutzt werden muss, ist aver micht pflicht, du kannst auch das normale referenz verhalten dafuer benutzendeine methode wuerde dann so aussehen:
private void ÜbergabeEigenschaft(double element, string text, bool pflichteingabe) { if(pflichteingabe && !text.Equals("")) text = "----"; else element = Convert.ToDouble(text); } double output; ÜbergabeEigenschaft(output, tbx.Text, true);
// aber was soll das "----" ? wenn du die methode dann zwei mal nacheinander auf rufst funktioniert das convertieren zu double nicht mehr (ich wuerde double.TryParse verwenden - ist das ergebnis eher steuerbar)
-
@Mr Evil
Vergiß das Keywort out nicht wenn du ihm dennoch ein Beispiel postest obwohl du es selber so nicht lösen würdest.
-
Hallo, habe zur Verständnis noch die Methode ÜbergabeEigenschaft() hinzugefügt, damit die Problemstellung nochmals deutlicher wird. Es geht um die Eigenschaften der Klasse. Wie kann ich in der Methode einen Platzhalter für die Eignschaften der Klasse anlegen, in diesem Beispiel hier habe ich demonstrativ den "Werkzeugdurchmesser" eingesetzt. Das funzt ja so nicht, aber gibt es dafür eine Lösung oder ist so was gar nicht möglich?
public class ClassDatenprüfung { private double werkzeugdurchmesser; private double messtiefe; public double Werkzeugdurchmesser { get { return werkzeugdurchmesser; } set { werkzeugdurchmesser = value;} } public double Messtiefe { get { return messtiefe; } set { messtiefe = value;} } ÜbergabeEigenschaft(Werkzeugdurchmesser, tbx_EingabeDurchmesser); // Beispiel der Methode mit Eigenschaft, funktioniert aber so nicht /* Methode für die Übergabe der Eingabe in die TextBox in der Eingabemaske. Hier soll geprüft werden, ob die Eingabe für die BErechnung auch tatsächlich erforderlich ist. Das muss für jede Eigenschaft der Klasse passieren. Leider habe ic hin meiner Klasse 30 Eigenschaften, und diese möchte ich dann in der MEthode als Argument übergeben. */ /// <summary> /// Übergabe des Textboxinhaltes an die Klassenigenschaft. /// </summary> /// <param name="?">Platzhalter für die Porperty (Eigenschaft) der Klasse</param> /// <param name="tbx">Inhalt der Textbox die übergeben werden soll.</param> /// <param name="pflichteingabe">if set to <c>true</c> [pflichteingabe].</param> /// <remarks> Mit der boolschen Variable "pflichteingabe" wird geprüft, ob die textbox eine optionale Eingabe oder ein Pflichteingabefeld ist</remarks> private void ÜbergabeEigenschaft(Werkzeugdurchmesser, TextBox tbx, bool pflichteingabe) { if(pflichteingabe && (tbx.Text != "")) tbx.Text = "----"; else { Werkzeugdurchmesser = Convert.ToDouble(tbx.Text); // Der Klasseneigenschaft Wert übergeben } }
-
Mir scheint hier das Konzept nicht wirklich gut zu sein. Du hast doch eine Textbox für jeweils eine Eigenschaft? Also eine für Werkzeugdurchmesser und eine für Messtiefe?
Wenn ja, dann setz die Eigenschaften entsprechend, wenn du die Textboxes validierst.
Du könntest die PropertyInfo-Objekte übergen, aber irgendwo muss ja die Entscheidung getroffen werden welche Property gesetzt werden soll. Deswegen denke ich, dass es wahrscheinlich garnicht nötig ist, dass diese als Parameter übergeben werden.
Erklär mal bitte wie deine Applikation funktionieren soll? Eigabemaske in der Eigenschaften gesetzt werden sollen?
Viele Grüße
-
Ja das Konzept ist echt nicht gut, aber vll. Hift dir "PropertyInfo" und "SetValue" weiter, Stichwork Refelctions:
Hier para Beispiel und Test Klassen:
class MyClass { double _val = default(double); public double MyProperty { get { return _val; } set { _val = value; } } } static class PropertySetter { public static void ManipulateProperty( PropertyInfo prop, object dest, double val) { prop.SetValue(dest, val, null); } }
und hier das Property setzen:
Type tp = typeof(MyClass); PropertyInfo pi= tp.GetProperty("MyProperty"); MyClass test = new MyClass(); PropertySetter.ManipulateProperty(pi, test, 5);
-
NullBockException schrieb:
Ja das Konzept ist echt nicht gut, aber vll. Hift dir "PropertyInfo" und "SetValue" weiter, Stichwork Refelctions:
Hier para Beispiel und Test Klassen:
class MyClass { double _val = default(double); public double MyProperty { get { return _val; } set { _val = value; } } } static class PropertySetter { public static void ManipulateProperty( PropertyInfo prop, object dest, double val) { prop.SetValue(dest, val, null); } }
Geht das hier auch einfacher? Warum eine statische Klasse anlegen? Die Instanz von Type kann doch auch direkt in der Klasse mit den Eigenschaften in eine Methode eingesetzt weren, oder? Dann kann man doch bestimmt auch in der Methode die PropertyInfo, d.h. die übergebene Eigenschaft manipulieren, evtl. auch von irgendwelchen Abhängigkeiten die noch abgefragt werden. Habe das probiert. Leider kann ich die Eigenschaft die ich in der Methode als Argument (string property) übergebe nicht verändern. ==> pi.SetValue setzt bei der Eigenschaft keinen neuen Wert. Was mache ich falsch, oder gibts da eine andere Sache wie ich die Property manipulieren kann?
und hier das Property setzen:
Type tp = typeof(MyClass); PropertyInfo pi= tp.GetProperty("MyProperty"); MyClass test = new MyClass(); PropertySetter.ManipulateProperty(pi, test, 5);
Man Müßte von deinem Vorschlag so etwas machen können:
blic class ClassDatenprüfung { private double werkzeugdurchmesser; private double messtiefe; double zahl = 100.0; public double Werkzeugdurchmesser { get { return werkzeugdurchmesser; } set { werkzeugdurchmesser = value;} } public double Messtiefe { get { return messtiefe; } set { messtiefe = value;} } /* Methode für die Übergabe der Eingabe in die TextBox in der Eingabemaske. Hier soll geprüft werden, ob die Eingabe für die BErechnung auch tatsächlich erforderlich ist. Das muss für jede Eigenschaft der Klasse passieren. Leider habe ic hin meiner Klasse 30 Eigenschaften, und diese möchte ich dann in der MEthode als Argument übergeben. */ /// <summary> /// Übergabe des Textboxinhaltes an die Klassenigenschaft. /// </summary> /// <param name="?">Platzhalter für die Porperty (Eigenschaft) der Klasse</param> /// <param name="tbx">Inhalt der Textbox die übergeben werden soll.</param> /// <param name="pflichteingabe">if set to <c>true</c> [pflichteingabe].</param> /// <remarks> Mit der boolschen Variable "pflichteingabe" wird geprüft, ob die textbox eine optionale Eingabe oder ein Pflichteingabefeld ist</remarks> private void ÜbergabeEigenschaft(string property, double x, bool pflichteingabe) { Type tp = new Type(ClassDatenprüfung); PropertyInfo pi = tp.GetValue("property"); EigenschaftVerändern(pi); ??? } }
Aber ich galueb nu auch zu verstehen, daßman mit dieser .SetValue() den tatsaächlichen WErt der Eigenschaft nicht verändern kann, sondern den an eine andere Variable oder ein Objekt übergibt. Ist das korrekt?