Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Zugriff auf Klasse mittels String-Variable
Stoffel000
myCSharp.de - Member



Dabei seit:
Beiträge: 4

Themenstarter:

Zugriff auf Klasse mittels String-Variable

beantworten | zitieren | melden

Hallo liebes Forum,
in diesem Forum habe ich schon oft Hilfe gefunden. Doch leider diesmal nicht. Ich bin ziemlich neu in der Programmierung und habe momentan ein Problem an dem ich mir die Zähne ausbeiße.


List<Tuple<string, string>> list = new List<Tuple<string,string>>();
TextBox.Text = MeineKlasse.[hier sollte der 2. wert der liste stehen];

Die Klasse selbst und auch die List ist kein Problem. Das funktioniert soweit. Nun meine Frage: Ist es möglich aus dem String der List auf ein Objekt der Klasse zuzugreifen?

Dies ist ein vereinfachtes Beispiel. Die Klasse selbst hat über 400 Objekte und die List hat 6 Strings. Ein direkter Zugriff wäre zwar möglich aber ein sehr hoher Programmieraufwand.

Ich hoffe ich habe nichts vergessen. Falls doch, bitte einfach nachfragen.

Danke im Voraus.

LG Stoffel000
private Nachricht | Beiträge des Benutzers
JimStark
myCSharp.de - Member

Avatar #dOpLzh7hN1az1g0eGRc0.jpg


Dabei seit:
Beiträge: 255

beantworten | zitieren | melden

Zitat von Stoffel000

Die Klasse selbst und auch die List ist kein Problem. Das funktioniert soweit. Nun meine Frage: Ist es möglich aus dem String der List auf ein Objekt der Klasse zuzugreifen?



Das hört sich verdächtig nach falscher Planung an, zeig doch mal deine Klasse.
Du willst in Abhängigkeit eines Strings der Liste auf ein bestimmtes Feld der Klasse zugreifen?
private Nachricht | Beiträge des Benutzers
ClaraSoft
myCSharp.de - Member



Dabei seit:
Beiträge: 34

beantworten | zitieren | melden

Hallo,

Hast du dir mal die Klasse Dictionary<Tkey, TValue> angeschaut, damit dürftest du eher ans Ziel zu kommen, weil du dann dein Tuple nicht mehr in einer Liste wrappen müsstest.

Hier die Doku zu Dictionary:
Dictionary<TKey,TValue> Klasse (System.Collections.Generic)

Grüße
private Nachricht | Beiträge des Benutzers
Stoffel000
myCSharp.de - Member



Dabei seit:
Beiträge: 4

Themenstarter:

beantworten | zitieren | melden

Hallo JimStark,

hier ein kleiner Ausschnitt meiner Klasse:


 public class ClassDatenblatt_DC
    {
        public int Id { get; set; }
        public string Zeitstempel { get; set; }
        public string Ersteller { get; set; }
        public Nullable<int> Status { get; set; }
        public string Datum { get; set; }
        public string Artnr { get; set; }
        public string Berechnungsnummer { get; set; }
        public Nullable<int> Version { get; set; }
        public Nullable<int> Aenderung { get; set; }
        public string Stromrichter { get; set; }
....
}
und hier ein Ausschnitt der List:


 wandlerlistDc = new List<Tuple<string, string, string, string, string, string>>
            {
                new Tuple<string, string, string, string, string, string>("abnummer", "", "", "", "", ""),
                new Tuple<string, string, string, string, string, string>("pos", "", "", "", "", ""),
                new Tuple<string, string, string, string, string, string>("status", "status", "", "", "", ""),
                new Tuple<string, string, string, string, string, string>("erst_dat", "datum", "", "", "", ""),
                new Tuple<string, string, string, string, string, string>("a1", "berechnungsnummer", "", "", "", ""),
                new Tuple<string, string, string, string, string, string>("v1", "version", "", "", "", ""),
....
}

Wenn aus meiner List der 5. Eintrag an der Reihe ist, soll a1 als Label angezeigt werden und die Berechnungsnummer als Wert der Klasse geladen werden (würde dem 7. Eintrag der Klasse entsprechen.)
Der Zugriff auf den Wert der Klasse funktioniert mit:


internal Klassenbibliothek.ClassDatenblatt_DC neuerDatensatzBearbeiten = new Klassenbibliothek.ClassDatenblatt_DC(); //erstellen einer Ableitung der Klasse
TextBox.Text = neuerDatensatzBearbeiten.berechnungsnummer;
Da ich aber über den String der List zugreifen möchte (um mir sehr viel Arbeit zu ersparen) müsste das in etwa so aussehen:


internal Klassenbibliothek.ClassDatenblatt_DC neuerDatensatzBearbeiten = new Klassenbibliothek.ClassDatenblatt_DC(); //erstellen einer Ableitung der Klasse
TextBox.Text = neuerDatensatzBearbeiten.[StringDerListeFürDenZugriff];

Wie gesagt ich bin nicht wirklich fit in der Programmierung. Sollte ich einen komplett falschen Ansatz gewählt haben, dies bitte auch sagen und evtl. einen Vorschlag machen wie ich es besser machen könnte.

Danke.
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4029

beantworten | zitieren | melden

Hallo,

das Stichwort dafür ist Reflection, s.a. C# Reflection Examples (bei dir also mittels PropertyInfo).
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
Stoffel000
myCSharp.de - Member



Dabei seit:
Beiträge: 4

Themenstarter:

beantworten | zitieren | melden

Hallo Th69,

ich habe mir soeben den verlinkten Beitrag angesehen. Leider verstehe ich das nicht ganz. Kannst du mir ein Beispiel geben?

Danke

Grüße Stofffel000
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4029

beantworten | zitieren | melden

Da wirst du dich selber ein bißchen einlesen müssen.
Die Hauptmethode für dich ist Type.GetProperty sowie PropertyInfo.GetValue (dort gibt es auch jeweils Beispiele).

PS: Die Strings für die Eigenschaftsnamen müssen aber exakt übereinstimmen (d.h. auch Groß-/Kleinschreibung).
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
Stoffel000
myCSharp.de - Member



Dabei seit:
Beiträge: 4

Themenstarter:

beantworten | zitieren | melden

Danke für die Hilfe. Da werde ich dann mal lesen und googlen um das zu verstehen. Die Eigenschaftsnamen setzte ich mit ToLower() alle auf Kleinbuchstaben. Somit sind sie dann gleich.

Danke, danke, danke. Hast mir sehr geholfen.

Grüße
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4029

beantworten | zitieren | melden

Wenn die Eigenschaft Status heißt, so mußt du auch "Status" bei GetProperty angeben (und nicht "status")!
Eigenschaftsnamen in C# sollten laut C# Coding Conventions auch genau so benannt sein (d.h. mit einem großgeschriebenen Anfangsbuchstaben), dies solltest du also nicht ändern.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Th69 am .
private Nachricht | Beiträge des Benutzers
JimStark
myCSharp.de - Member

Avatar #dOpLzh7hN1az1g0eGRc0.jpg


Dabei seit:
Beiträge: 255

beantworten | zitieren | melden

Würde es gar nicht so kompiliziert machen:


enum Field
{
 abnummer,
 pos,
...
}

wandlerlistDc = new List<Tuple<Field, string, string, string, string, string>>
            {
                new Tuple<string, string, string, string, string, string>(Field.abnummer, "", "", "", "", ""),
...
....



und in der Klasse:


public string GetOrderInfo(Field field)
{
   switch(field)
      {
      case field.abummer:
        return this.Artnr;
...

Dann könntest du es da auch richtig formatieren, ist vielleicht mehr Schreibarbeit, fände ich aber einfacher
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15832
Herkunft: BW

beantworten | zitieren | melden

Für sowas erstellt man eigentlich Metadata-Informationen/Klassen, denn der bisherige Ansatz und über Reflection skaliert nicht.
Die Änderung an einem String, an der Klasse und Co würde dazu führen, dass es knallt, weil Du es auch nicht validieren kannst.
Report-Komponenten machen das quasi in der Designer-Time. Neuere Reports gehen den Weg von Source Code Generators, der hier wahrscheinlich auch verwendet werden kann.

Der Aufbau (von der Klasse und auch den Tuples) ist zudem ein Zeichen bzw ein Hinweis, dass was an der Struktur / Architektur womöglich grundlegend nicht stimmen könnte.
Was Du mit "die Klasse hat über 400 Objekte" erschließt sich mir inbesondere aufgrund von "Objekt" nicht. Riecht aber auf alle Fälle auch eher fischig.

Reflection ist ein vergleichsweise komplexes Thema, das Du sicherlich nicht in den 10 Minuten zwischen Antwort und Post durchgelesen oder gar verstanden haben kannst.
Das wird Dich eher paar Tage kosten; lohnt sich aber generell sowieso :-)
private Nachricht | Beiträge des Benutzers