2009-06-08 14 views
0

Eine bestimmte Klasse hat eine Hashtable mit 1..N Elementen. Ich frage mich, ob es generische Getter/Setter-Methoden für die Hashtable gibt, die in einer Klasse verwendet werden. Ich suche die Hash-Tabelle Werte verhalten sich eher wie normale Objekteigenschaften zu machen:Hashtable "Standard" Getter?

public class foo 
{ 
    private HashTable _stuff; 
    public HashTable stuff { get; set; } 
    public foo() {} 
} 

Ich frage mich, ob so etwas passieren kann:

diese
foo bar = new foo(); 
bar.stuff.name; //returns the data in the 'name' index if it exists 
bar.stuff.name = "Me"; //sets the stuff[name] value = "me" 

Antwort

1

In der aktuellen Version von C# gibt es nichts Vergleichbares. Das dynamische Zeug in C# 4.0 wird dies vereinfachen.

In der Zwischenzeit, warum nicht einfach Name (und andere Werte) einfache Eigenschaften? Während Sie dabei sind, finden Sie das generische Dictionary<K,V> einfacher zu arbeiten als HashTable.

+0

Die Elemente in der Hash aus einer Datenbankabfrage kommen. Die Schlüssel in den Hash == db-Spalten aus der Abfrage. Wir hatten gehofft, dass eine Änderung an der gespeicherten Prozedur eine dynamisch generierte HTML-Tabelle/-Liste am Front-End ändern würde, ohne eine Menge zusätzlicher Codierung, um das hinzugefügte Feld zu berücksichtigen. – JayTee

+0

Dafür scheint eine Standardtabelle/ein Standardwörterbuch der einfachste Weg zu sein. Fügen Sie für jeden Schlüssel in der Tabelle eine Spalte zur generierten HTML-Tabelle hinzu. –

0

Sie können nicht mit C#, bei zumindest nicht in der aktuellen Version. Was Sie brauchen, ist das Äquivalent von method_missing in Ruby.

Wenn dies C# 4.0 war, könnten Sie etwas Ähnliches mit anonymen Typen und dem dynamischen Schlüsselwort machen, jedoch müssten Sie die Schlüssel vorne kennen.

0

Offenbar können Sie das in. NET 4.0 durch die Implementierung der IDynamicMetaObjectProvider Schnittstelle tun ... scheint aber nicht trivial!

0

Je nachdem, wie Sie den HTML-Code rendern, gibt es einige Möglichkeiten, Ihr Problem zu lösen. Der obige Code ist wie angegeben in C# nicht möglich.

Zunächst einmal nehme ich an, dass es einen Grund gibt, warum Sie keine ADO-Objekte verwenden, die normalerweise die von Ihnen erwähnten Rendering-Probleme lösen (zusammen mit GridView oder ähnlich).

Wenn Sie eine Klasse mit „dynamischen“ Eigenschaften erzeugen Sie ein propertybag

schaffen es nicht den oben genannten Code möglich, obwohl macht aber mit einem Rendering-Engine auf TypeDescriptor mit benutzerdefinierten Beschreibungen basieren arbeiten.