Laden...

[gelöst] Instanzvariablen per Reflaction setzten

Erstellt von Andreas@Tricept vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.019 Views
A
Andreas@Tricept Themenstarter:in
289 Beiträge seit 2006
vor 15 Jahren
[gelöst] Instanzvariablen per Reflaction setzten

Hallo gibt es eine Möglichkeit Instanzvariablen eines Objektes per Reflaction zu setzten?
Bisher habe ich nur die Möglichkeit über die Properties gefunden.

Also das ich mit PropertyInfo mir die entsprechenden Properties des Objektes hole und dann mit SetValue setzte. Aber was ich erreichen will ist eine instanzvariable direkt setzen zu können ohne über das Set Property gehen zu müssen.

Ich hab leider keinen Ansatz wie ich an solche Felder ran komme. Mit GetMembers kriege ich ja nur Methoden (Getter und Setter). habt ihr eine Idee?

42 Beiträge seit 2008
vor 15 Jahren

Felder suchst du

Ich hab die Haare schön!!

A
Andreas@Tricept Themenstarter:in
289 Beiträge seit 2006
vor 15 Jahren

GetFields bezieht sich nur auf Enumerations

F
722 Beiträge seit 2005
vor 15 Jahren

GetFields bezieht sich nur auf Enumerations

Nein, GetFields liefert alle Felder eines Types.

Abgesehen davon, dass stark davon abzuraten ist, auf private Members eines Objekts zuzugreifen, kannst du es so machen:


class Program
    {
        static void Main(string[] args)
        {
            MyClass mc = new MyClass();
            FieldInfo fieldInfo = typeof(MyClass).GetField("_value", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
            int value = (int) fieldInfo.GetValue(mc);
        }
    }

    class MyClass
    {
        private int _value = 10;
    }

A
Andreas@Tricept Themenstarter:in
289 Beiträge seit 2006
vor 15 Jahren

Vielen dank das hab ich wirklich gesucht.
Hab nur mit GetFields() kein Ergebnis erhalten.

Das benötige ich um ICloneable zu implementieren und eine exakte Kopie zu erstellen.

42 Beiträge seit 2008
vor 15 Jahren

Ähm guck mal
Memberwiseclone und Serialisierung an.

Außerdem musst du bei getfields BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public übergeben, um richtige Ergebnisse zu erhalten.

Ich hab die Haare schön!!

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo Andreas@Tricept,

Das benötige ich um ICloneable zu implementieren und eine exakte Kopie zu erstellen.

dann solltest du wirklich MemberwiseClone verwenden, denn das kopiert nicht nur alle Felder sondern liefert vor allem bei Vererbung immer das richtige Objekt.

Allerdings liefert MemberwiseClone eine flache Kopie. Aber auch da ist es der dem GetFields-Ansatz vorzuziehen, wenn die untergeordneten Objekte selbst wieder MemberwiseClone verwenden.

herbivore