Eigenschaften programmgesteuert generieren
Ich soll zum laden eines properties-Datei (es ist eine .csv-Datei, die auf jede Zeile einen Namen und die zugehörigen numerischen Wert) und dann Zugriff auf die Eigenschaftswerte wie folgt: FileLoader.PropertyOne
oder FileLoader.PropertyTwo
. Das problem ist, ich will nicht zu haben zu schreiben, eine Eigenschaft, die für jeden Wert, ich will, dass Sie generiert aus der Datei. So
public class FileLoader
{
public int Property1 { get; private set; }
}
ist nicht das, was ich Suche. Ist das möglich? Ich sehe keinen Weg es zu tun, denn offensichtlich ist der compiler weiß gar nicht, über den Namen der Eigenschaft. Vielleicht etwas ähnliches?
- Schreiben Sie eine T4-Vorlage generiert .cs-Datei gegeben, die .csv.
- mögliche Duplikate von Wie erstelle ich dynamische Eigenschaften in C#?
Du musst angemeldet sein, um einen Kommentar abzugeben.
In C# 4.0, könnten Sie die ExpandoObject, link enthält eine gute Erklärung und ein paar Anwendungsfälle, wie :
Obwohl die awesomeness der ExpandoObject ist, um dynamisch erstellen Sie komplexe, hierarchische Objekte, ich nehme an, Sie können es verwenden, im Allgemeinen für den glänzenden syntax selbst für einfache dynamisch definierten Objekten.
EDIT: Hier ist eine weitere Antwort auf SO das hinzufügen von details über die Vorteile der ExpandoObject-von der gleichen Kolumnist, schrieb die zuvor verlinkten Artikel
Was sind die wahren Vorteile der ExpandoObject?
Dictionary
- Objekt in vb6, obwohlDictionary
könnte nur halten die Dinge von TypObject
:MyDict!Address!Street = MyStreetObject
. Man könnte etwas erreichen ähnlich wie in vb.net obwohl man müsste, um eine benannte Eigenschaft des letzten Objekts [z.B.st
fürstring
]:MyDict!Address!City.st = "Mercer Island"
; solch einen Ansatz hatte wohl über die gleichen Vorteile und Nachteile wie ExpandoObject.Code-Generierung wie dieses kann auf verschiedene Arten geschehen.
.generated.cs
suffix).Zimmerreserviereung, ohne das Sie Ihre "FileLoader" umschreiben sich selbst, und dann mithilfe von Reflektion, um Zugriff auf die neu erstellte Eigenschaften ther nicht wirklich Weg, dies zu tun. (Wurde komplett ignoriert diese Antwort, wenn Sie nach etwas, das funktioniert auf Design/Kompilierzeit statt zur Laufzeit =)
Was Sie werden wahrscheinlich am Ende tun, ist, dass etwas wie
Können Sie jetzt tun:
Natürlich könnte man so vereinfachen Sie es nach unten zu laden es in ein Wörterbuch, dass Sie die Rückgabe von einer Methode auf FileLoader, aber der code oben pflegt ein Teil der "Erscheinung" mit Eigenschaften der Klasse FileLoader =)
Bearbeiten: Hinzufügen "indexer" code
Eine Sache, vielleicht machen die syntax sauberer wäre, eine "Indexer", so würden Sie fügen Sie die folgenden FileLoader:
Dann den code für accessint würde, wäre es etwas aufgeräumter:
Hier ist ein Beispiel für die Verwendung
ExpandoObject
und C#4.0 dynamischenIm Grunde müssen Sie einige code-Generierung.
Schreiben Sie eine einfache Konsolen-app, oder win-forms-Anwendung für das laden der csv, dann nimmt die Informationen aus der csv und erzeugt .cs-Dateien.
Gibt es eine einfache Lösung für dieses, Lesen Sie die Eigenschaften in einem Wörterbuch und einer überlastung der
FileLoader
's array-operator:Diese Weise können Sie den Zugriff auf die Eigenschaften, die mit
fileLoadObject["SomePropertyName"]
.Als Oded wies darauf hin, es ist dynamisch hinzufügen von Eigenschaften mit Reflexion. Es ist ein Beispiel hier.
Dies ist möglich mit dem neuen dynamischen Sachen in c# 4.0. Ich bin kein Experte, aber mit dynamischen Objekten können Sie definiert das Verhalten für, wenn eine Methode, die nicht vorhanden ist, hervorgerufen. Dieser Beitrag zeigt ein ziemlich lustiges Beispiel, wie ein dynamisches Wörterbuch, das tun könnten, was Sie wollen.