Laden...

Zugriff auf Variablen-Typen und Namen anderer Klasse (NICHT den Inhalt)?

Erstellt von Arti vor einem Jahr Letzter Beitrag vor einem Jahr 445 Views
A
Arti Themenstarter:in
9 Beiträge seit 2022
vor einem Jahr
Zugriff auf Variablen-Typen und Namen anderer Klasse (NICHT den Inhalt)?

Hallo liebe C#-Profis,

ich habe als Anfänger ein Problem bei dem ich trotz intensiver Google und Forumssuche keine Lösug finde - wahrscheinlich weil ich nicht weiß wie das was ich tun will genau "heißt".

Program.cs


using System;

public class Program
{
    public string strFromKlasse;
    public int intFromKlasse;
    public float floatFromKlasse;

    static void Main(string[] args)
    {
        ZugriffKlasse zK = new ZugriffKlasse();

        Console.WriteLine("Programm gestartet...");
        zK.LeseAndereKlasse();
    }
}

ZugriffKlasse.cs


using System;

public class ZugriffKlasse
{
	public void LeseAndereKlasse()
	{
        Program p = new Program();
        Console.WriteLine("Klasse gestartet...");

        // Hier möchte ich eine Ausgabe aller public-Variablen in der Klasse Programm
        // Das sind folgende:
        // string strFromKlasse;
        // int intFromKlasse;
        // float floatFromKlasse;
        // ----------------------
        // Ich möchte folgende Daten: Datentyp und Name der Variable
        // Console.WriteLine("Type: " + Variablentyp.ToString() + " Name: " + Variablenname.ToString());
        // Variablentyp.ToString() & Variablenname.ToString() sind natürlich von mir erfunden! Ich weiß leider nicht wie ich diese Informationen bekomme...
    }
}

Wie im Text steht, möchte ich von der ZugriffKlasse-Klasse auf die Program-Klasse zugreifen und erfahren welche Public Variablen denn dort eigentlich definiert wurden.
Ich möchte wissen wie der Typ der Variable ist (zB string, int, float) und die die Variable heißt (zB strFromKlasse, intFromKlasse, floatFromKlasse).

Ich weiß nicht ob das überhaupt geht bzw. wenn es geht, wie...

Kann mir jemand helfen?

Wäre super nett!
Vielen Dank!
Arti

16.835 Beiträge seit 2008
vor einem Jahr

Hallo.

Generell ist es immer ratsam zu erklären, was das Ziel ist, das Du erreichen willst.
Aktuell hast Du nur erklärt, welches Problem Du hast - nicht das Ziel.

Hier sieht es so aus, als ob die Basis nicht stimmt bzw einfach simple Grundlagen fehlen 😉
Und es wäre sehr unpraktisch wenn wir nur die Lösung eines Symptoms beachten, aber nicht die Ursache.
Das hilft Dir ja nicht.

Zu den Symptomen:


public class Program
{
    public string strFromKlasse;
    public int intFromKlasse;
    public float floatFromKlasse;


Das hier sind Felder, keine einfachen Variablen. Felder haben eine besondere Funktion in C# und sollten in fast allen Fällen private sein.
Fields - C# Programming Guide
Davon abgesehen würde man diese Felder normalerweise nicht in die Program-Klasse stecken, die für den Start der App verantwortlich ist.

Und als letztes sollte eine Logikklasse - hier "ZugriffKlasse" - niemals Kenntnis über die Start-Klasse Program haben.
Siehe => [Artikel] Drei-Schichten-Architektur
Daher: bitte erklär, was das Ziel ist 😉

A
Arti Themenstarter:in
9 Beiträge seit 2022
vor einem Jahr

Hallo Abt,

danke für Deine Antwort.

Das Problem beim Erklären des Themas ist, das ich in Unity etwas scripte und nicht "nur" einfach ein C#-Programm schreiben will...

Aber: DU HAST MIR GEHOLFEN!

Mit den Stichwort "Field" bin ich weiter gekommen:

ZugriffKlasse.cs


using System;
using System.Diagnostics;
using System.Reflection;

public class ZugriffKlasse
{
	public void LeseAndereKlasse()
	{
        Program p = new Program();
        Console.WriteLine("Klasse gestartet...");

        foreach (FieldInfo fieldInEDb in typeof(Program).GetFields())
        {
            Console.WriteLine(fieldInEDb.Name);
            Console.WriteLine(fieldInEDb.FieldType);

        }
    }
}

Das tut genau das was ich will...
Name gibt des Namen des Fields zurück, FieldType den Typ...

Also DANKE für Deine Hilfe!
Grüße,
Arti

T
2.224 Beiträge seit 2008
vor einem Jahr

Das was du dort machst nennt sich übrigens Reflection.
Dies ist dann Teil der Metaprogrammierung von C#/.NET
Sollte man aber nur verwenden, wenn es wirklich nötig ist.

Anbei solltest du dir bei Klassen zur Datenhaltung auch Properties anschauen.
Damit hat man dann die eigentliche Schnittstelle zu den Feldern.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

A
Arti Themenstarter:in
9 Beiträge seit 2022
vor einem Jahr

Ok, danke Dir.
Das werde ich mir morgen mal anschauen!

M
368 Beiträge seit 2006
vor einem Jahr

...Anfänger...

Längerfristig sollte man empfohlene menschliche Verhaltensweisen -die das (häufige(re)) Ändern/Erweitern/Nutzen/Pflegen/... (an zentraler Stelle) der Software erleichtern- wie (z.B.) Namespaces, Namenskonventionen, SOLID-Prinzipien ("encapsulate what varies"), Aufteilung in Schichten, Versionsverwaltung, "pro Klasse eine Aufgabe", Dokumentation, TDD, Architektur,... beachten. Mit zunehmender Menge an Akteur:innen kommen weiterhin Stichworte wie (z.B.) Scrum, Kanban, "Code-Ownership", "mit Leuten reden",... ins Spiel.

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉