Hinzufügen von Eigenschaften zu Klassen dynamisch C#
Möchte ich das hinzufügen von Eigenschaften zu einer Klasse dynamisch und setzen Ihnen Werte zu. Könnte mir jemand zeigen in die richtige Richtung zu einigen tutorials oder Artikel oder noch besser ein Beispiel geben.
Ich habe eine base-Klasse, die aufgerufen wird, in einer foreach-Schleife. Innerhalb dieser Klasse muss ich hinzufügen, bis zu 30 Eigenschaften und Werte, um Sie.
Dies ist die Methode, ruft die Klasse.
foreach (Class name in this.list)
{
ClassBeingCalled class = new ClassBeingCalled (name);
class.Populate();
this.newlist.Add(class);
}
Nun innerhalb der Klasse aufgerufen wird, muss ich zum erstellen der 30-oder so-Eigenschaften auf die Fliegen, die in der "Füllen" - Methode der Klasse.
Wie so...
foreach (PropertyToAssign count2 in listofproperties)
{
string name = "_nameofproperty" + count2.name
base.GetType().GetField(name, BindingFlags.NonPublic |
BindingFlags.Instance).SetValue(this, count2);
}
Was stimmt nur mit 'listofproperties' anstatt zu versuchen, erstellen Sie dynamische Eigenschaften? Wenn es sein muss Dynamic haben Sie einen Blick auf msdn.microsoft.com/en-us/library/vstudio/dd264741.aspx
Wie meinst du das?
Tun, was existieren als Eigenschaften? also werden Sie versuchen, zu erstellen, der neuen "Eigenschaften"? oder belegen Sie die vorhandenen Eigenschaften?
Ich denke, man sollte vielleicht Bedenken nur mit einem internen Wörterbuch mit einem indexer, so würden Sie den Zugriff auf Ihre Eigenschaften wie
Btw, im Titel heißt es "Eigentum", aber in der füllen-Methode, es spiegelt "Felder"
Wie meinst du das?
Tun, was existieren als Eigenschaften? also werden Sie versuchen, zu erstellen, der neuen "Eigenschaften"? oder belegen Sie die vorhandenen Eigenschaften?
Ich denke, man sollte vielleicht Bedenken nur mit einem internen Wörterbuch mit einem indexer, so würden Sie den Zugriff auf Ihre Eigenschaften wie
myObject["PropertyName"]
(erzielen Sie effektiv die gleiche Sache mit einem ExpandObject).Btw, im Titel heißt es "Eigentum", aber in der füllen-Methode, es spiegelt "Felder"
InformationsquelleAutor Pavan Dhariwal | 2013-05-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gibt es ein paar Möglichkeiten, dies zu nähern.
a) verwenden Sie reflektion, um zu generieren, eine Klasse zur Laufzeit mit, was Sie brauchen. Sie können immer die Ableitung dieser generierte Klasse von einer Basisklasse, enthält
Populate
aber ich sehe nicht die Notwendigkeit.b) Wenn Sie C# 4.0+, Sie könnte verwenden
ExpandoObject
, die können Sie einstellen, welche Eigenschaften möchten Sie für Ihre Bedürfnisse. Beachten Sie, dass diese nicht Hinzugefügt, die Eigenschaften per se, da Sie mit dem DLR, die alle Laufzeit-basiert. Je nach Ihren Bedürfnissen, das mag in Ordnung sein, das ist ziemlich viel dasselbe als Ansatz c, aber mit dem DLR.c) könnte Man eine backing-Wörterbuch und verwenden Sie ein indexer, etwa so:
Durch die Verwendung von Ansatz 3, bist du eigentlich die Indizierung basiert auf
string
s die wohl besser basierend auf Ihren Anforderungen,... Wie Sie tun können, etwas entlang der Linien von:Am Ende des Tages, es ist wohl am besten, wenn Sie erklären, das problem, das Sie versuchen zu lösen, da es möglicherweise einen besseren Weg, um Ansatz völlig.
Sie schlug Ihre bereits existierende Lösung festlegen von Eigenschaften in eine Klasse und erzählte uns, dass Sie brauchen, um Eigenschaften hinzuzufügen. In der Realität sollten Sie wahrscheinlich Blick in option c hier (wurde auch vorgeschlagen, die von anderen in dieser Frage), und anstatt der Eigenschaft, nur setzen Sie den Wert auf dem internen Wörterbuch.
Wie würde ich definieren Sie den Typ der Eigenschaft in das Wörterbuch?
Gut, haben Sie nicht. Verwenden Sie
object
so dass Sie stick alles drin. Wenn Sie nur 1 Datentyp können Sie jederzeit ändernobject
zustring
oder was auch immer, geben wird.Hi Rudi, ich bekomme die folgende Fehlermeldung: kann Nicht angewendet werden, der Indizierung mit [] ein Ausdruck vom Typ 'BusinessLogic.InvoiceBaseUIBindable " Nachdem ich Hinzugefügt - dieser[name] = count2.Wert;
InformationsquelleAutor Rudi Visser
Ist es nicht möglich, Sie dynamische Eigenschaften hinzufügen können, um eine kompilierte Klasse on-the-fly. Sie kann nur hinzufügen, dass die dynamischen Eigenschaften zu Klassen beim erstellen der Klasse selbst auf das Fliegen mit Reflexion.Emittieren
Ihre andere option könnte sein, mit einem Wörterbuch oder ExpandoObject (was ist eigentlich ein Wörterbuch). Aber für diese option, können Sie nicht auf Ihre dynamischen Eigenschaften mit der spiegelung.
InformationsquelleAutor Mehmet Ataş