2 Stimmen

Erstellen eines Wörterbuchs für ein beliebiges Objekt

Was ich möchte, ist die Möglichkeit, Namens- und Objektpaare zu speichern.

Im Gegensatz zu objC ist c#s Dictionary erfordert Typen. In objC würde ich verwenden id "jedes beliebige Objekt" bedeuten.

Wie würde ich dies in c# verwalten.

Wonach ich also suche, ist:

Dictionary<String,id> .

Tut mir leid, wenn das sehr einfach ist!

4voto

Adam Houldsworth Punkte 61593

Ohne eine Menge Aufwand zu betreiben, um mit mehreren stark typisierten Listen von Objekten zu kommunizieren, ist der einfachste Weg, dies mit einer Dictionary<string, object> und Ihren Objekttyp bei Bedarf auszuwählen:

int i = (int)myDictionary["Age"];
string n = (string)myDictionary["Name"];

Hier gibt es einige dynamische Optionen wie ExpandoObject :

http://msdn.microsoft.com/en-us/library/system.dynamic.expandoobject.aspx

Wenn Sie den Ansatz des Objektwörterbuchs wählen, achten Sie auf Boxen auf Werttypen . Die Verwendung des dynamischen Ansatzes hat keine Auswirkungen auf das Boxen, erfordert aber eine Laufzeitauflösung, so dass die Leistung erneut leicht beeinträchtigt wird.

Nichts ist umsonst, aber im Großen und Ganzen sollten Sie die Auswirkungen dieses geringen Aufwands nicht bemerken.

0voto

chemicalNova Punkte 821

Es gibt immer den neuen dynamischen Typ in .NET 4, wenn Unboxing ein Problem ist.

0voto

alexey Punkte 307

Ich weiß nicht, ob ich Sie richtig verstanden habe, aber Sie können Folgendes machen:

    Dictionary s = new Dictionary();
    Object a = new Int32();
    a = 1;
    Object b = new Double();
    b = 2.0;
    s.Add("a", a);
    s.Add("b", b);
    Int32 v = Convert.ToInt32(s\["a"\]);
    Double u = Convert.ToDouble(s\["b"\]);
    Console.WriteLine(v + " " + u);

-1voto

Diese Frage könnte ein Hinweis darauf sein, dass sich dahinter ein schlechtes Design verbergen könnte. Das ist immer der Fall, wenn Sie eine Sammlung heterogener Objekte benötigen.

Da Sie den Typ der Objekte in der Sammlung nicht kennen, müssen Sie immer eine Art von Typüberprüfung durchführen, z. B. if (dictionary["xy"] is string) {...} was ein Codegeruch ist.

Wäre es eine Möglichkeit, eine gemeinsame Klasse zu bilden? Das würde Ihnen erlauben, einige gemeinsame Operationen darauf zu spezifizieren (weil Sie wahrscheinlich einige gemeinsame Operationen brauchen, wenn Sie sie im gleichen Diktat brauchen). Zum Beispiel etwas wie (betrachten Sie es als Pseudocode):

class Base
{
   bool IsCollection;
}

class StringItem : Base
{
   string Contents;
   IsCollection = false;
   override ToString() { return this.Contents; }
}

class ListItem : Base
{
   List<StringItem> Contents;
   IsCollection = true;
   override ToString() { return string.Join(",", this.Contents.ToArray() }
}

Dann könnten Sie eine Dictionary<string, Base> und verwenden Sie auf Base definierte Operationen wie ToString oder irgendeinen Brauch.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X