Laden...

[erledigt] Kann man in C# mehrere Eigenschaften zu Eigenschaften bzw. hinzufügen?

Erstellt von m.grauber vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.063 Views
M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren
[erledigt] Kann man in C# mehrere Eigenschaften zu Eigenschaften bzw. hinzufügen?

Hallo,

ich weiß leider nicht, nach welchem Begriff ich suchen muss und ob dies überhaupt so geht:

es gibt z. B. folgende Klasse:


public class Kunde
{
  public String Kundenname = "";
  public Int Kundennummer { get; set; }
}

Jetzt möchte ich zu den Klassenmembern weitere Eigenschaften (z. B. Wert1 und Wert2) definieren, um dann so darauf zuzugreifen:


Kunde.Kundenname.Wert1 = "Hallo"
Kunde.Kundenname.Wert2 = 12
Kunde.Kundenname = "Michael"   // trotzdem kann direkt weiterhin auf Kundenname zugegriffen werden

Kunde.Kundennummer.Wert1 = "Test"
Kunde.Kundennummer.Wert2 = 14
Kunde.Kundennummer = 10


In der Definition möchte ich es relativ einfach haben, etwa so:


public class Kunde
{
  ExtendAll
  {
    public String Wert1 = "";
    public Int Wert2 = 0;
  }
  public String Kundenname = "";
  public Int Kundennummer { get; set; }
}

Das klappt natürlich nicht. Jedoch sollten alle im forall-Teil angegebenen Dinge für jedes Klassenmember einzeln verfügbar sein.

Jetzt bin ich gespannt 🤔

Vielen Dank!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

5.658 Beiträge seit 2006
vor 13 Jahren

Du mußt dir deinen eigenen Datentyp erstellen, siehe :rtfm:, 🛈 oder 📗

Weeks of programming can save you hours of planning

U
50 Beiträge seit 2009
vor 13 Jahren

Hi,

ich würde das wahrscheinlich so machen:

class Eigenschaft<T>
{
     public T Value;
     public String Wert1;
     public int Wert2;
}

Funktioniert zwar nicht ganz so, wie du willst, aber es funktioniert.

1.002 Beiträge seit 2007
vor 13 Jahren

Hallo m.grauber,

wenn Kundenname und Kundennummer keine einfachen Datentypen, sondern Klassen sind, die die Eigenschaften Wert1 und Wert2 enthalten, ist das möglich. Du solltest dabei allerdings das Gesetzt von Demeter beachten.

Edit: Bitte beachte vorsorglich [Hinweis] Wie poste ich richtig? Punkt 1.1.1!

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo m0rius, userid16184, MrSparkle,

vielen Dank für die schnelle Hilfe! Jedoch kann ich den Datentyp nicht so einfach ändern:

Kundenname und Kundennummer sind vom Entity Framework vorgegeben und können leider nur erweitert werden (mit partial). Ich kann leider den Datentyp nicht ändern und will nur in einer partiellen Klasse die "Untermember" für jeden Member der Klasse anhängen.

Ich möchte sowohl bei Kundenname als auch bei Kundennumer und evtl. noch vielen weiteren Eigenschaften jeweils getrennt Wert1 und Wert2 hinterlegen können, d. h. in Kunde.Kundenname.Wert1 kann etwas anderes enthalten als Kunde.Kundennummer.Wert1.

Ich hoffe, das ist irgendwie machbar.

Vielen Dank!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]

771 Beiträge seit 2009
vor 13 Jahren

Da du den Datentyp nicht ändern kannst, wirst du eigene Membervariablen deklarieren müssen.
Du könntest dir ein 'enum' definieren (je Eigenschaft) und dann ein Dictionary<MyEnum, MyClass> erzeugen, um die zusätzlichen Eigenschaften aufzunehmen.
Und evtl. sogar den Indexer der Klasse benutzen:


enum MyEnum { Kundenname, Kundennummer }

class MyClass
{
    public string Wert1;
    public int Wert2;
}

Dictionary<MyEnum, MyClass> myDict = new Dictionary<MyEnum, MyClass>();

MyClass this[MyEnum e]
{
   get { return myDict[e]; }
   set { myDict[e] = value; }
}

// Aufruf dann z.B. so
Kunde[MyEnum.Kundenname].Wert1 = "Test";
Kunde[MyEnum.Kundennummer].Wert2 = 42;

Evtl. könnte man es auch mit "Aspektorientierter Programmierung" so hinkriegen, kenne mich selber aber nicht damit aus 😭

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo m.grauber,

mit . kannst du nur auf die Member des Typs zu greifen.

Wenn du Kunde.Kundennummer.Wert1 schreiben willst, muss der Typ, von dem Kunde.Kundennummer ist, ein Member Namens Wert1 haben.

Wenn der Typ aber String oder int ist, gibt es kein Member Wert1.

Das gehört, wie m0rius schon angedeutet hat, aber zu den absoluten Grundlagen.

herbivore

PS: Mit C# 3.0 gibt es zwar Erweiterungsmethoden, aber keine Erweiterungsproperties.

M
m.grauber Themenstarter:in
343 Beiträge seit 2010
vor 13 Jahren

Hallo Cat und Herbivore,

Danke für Eure Hilfe! War leider etwas unterwegs und habe danach zuersteinmal viel getestet:

Das es nicht direkt geht, ist gut zu wissen - Ich hatte mich schon "Wund" gesucht.

Den Workaround über den Indexer und das Dictionary ist wirklich sehr intelligent und gefällt mir sehr gut! 👍

Vielen Dank!!!!

Mfg
Michael

PS: Ich stelle nur Fragen, wenn ich in Büchern, im Web und in Foren nichts gefunden habe. Dumme Fragen bitte ich zu entschuldigen!

:] VISUAL STUDIO 2017 + .NET FRAMEWORK 4.5 + SQL-Server 2012 :]