setvalue-Methode für Eigenschaft kann nicht gefunden werden [Duplikat]

Dec 13 2020

Ich versuche einen Weg zu finden, um alle Felder in einem Objekt zu durchlaufen.

Zuerst habe ich versucht, die Wertefelder mithilfe der Projektion abzurufen und auszudrucken. Das hat gut funktioniert:

 var ob = new {DeclarativeSecn = "da" , sksksk = "dingdong" };
       
 foreach (PropertyInfo property in ob.GetType().GetProperties())
      {
             Console.WriteLine(property.Name + " val " +  property.GetValue(ob));
       }

Natürlich möchte ich die Felder auf einige neue Werte setzen. Nach dem Lesen sieht es so aus, als ob dies funktionieren sollte:

 foreach (PropertyInfo property in ob.GetType().GetProperties())
      {
             property.SetValue(ob,"new String");
       }

Dies gibt mir "Eigenschaftssatzmethode nicht gefunden". Ich versuche auch, null als Argument anzugeben, was an einigen Stellen geschieht:

 property.SetValue(ob,"new String",null);

Dies hat die gleichen Ergebnisse. Warum scheitert das an mir?

EDIT: Es wurde mir darauf hingewiesen, dass ich mein Ziel nicht ausreichend beschrieben habe. Wie oben erwähnt, besteht das Ziel darin, die Felder in einem beliebigen Objekt zu durchlaufen, genau wie in diesem Beispielobjekt:

 var ob = new {DeclarativeSecn = "da" , sksksk = "dingdong" };

Und dann schreibe ich auch in der ursprünglichen Frage "Ich möchte die Felder auf einige neue Werte setzen". Dies bedeutet, dass ich die Felder im "ob" -Objekt durchlaufen und sie auf einen neuen Wert setzen möchte.

Dankeschön

Antworten

1 JonSkeet Dec 13 2020 at 22:26

Warum scheitert das an mir?

Aus dem gleichen Grund wie das Schreiben

ob.DeclarativeSecn = "new value";

würde zur Kompilierungszeit fehlschlagen, zumindest für das von Ihnen angegebene Beispiel. Ihr Objekt ist ein anonymer Typ, und die Eigenschaften anonymer Typen haben nur Getter. Sie können keine neuen Werte für die Eigenschaften festlegen. Wenn Sie die Eigenschaften anschließend ändern möchten, verwenden Sie keine anonymen Typen.

Beachten Sie, dass Ihre Frage sprach über Iterieren über die Eigenschaften von jedem Objekt, aber:

  • Beim Drucken wird davon ausgegangen, dass alle Eigenschaften Getter haben. das ist allgemein wahr, aber nicht immer
  • Wenn Sie neue Werte festlegen, gehen Sie davon aus, dass alle Eigenschaften Getter haben und dass es sich um Zeichenfolgeneigenschaften handelt

Keine dieser Annahmen ist im Allgemeinen richtig . Wenn Sie also in der Lage sein möchten, ein Objekt zu verarbeiten , müssen Sie etwas mehr Überprüfungen hinzufügen.

ThomasWeller Dec 13 2020 at 22:31

Anonyme Typen bieten eine bequeme Möglichkeit, eine Reihe schreibgeschützter Eigenschaften in ein einzelnes Objekt zu kapseln, ohne zuvor explizit einen Typ definieren zu müssen.

Hervorhebung von mir.

Anscheinend können Sie für eine schreibgeschützte Eigenschaft keinen Wert festlegen. Klingt vernünftig.