プロパティのsetvalueメソッドが見つかりません[重複]

Dec 13 2020

オブジェクトのすべてのフィールドを反復処理する方法を見つけようとしています。

最初に、プロジェクションを使用して値フィールドを取得して印刷しようとしましたが、これはうまく機能しました。

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

ただし、もちろん、フィールドをいくつかの新しい値に設定したいので、それを読んだ後、これはうまくいくはずです:

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

これにより、「プロパティセットメソッドが見つかりません」というメッセージが表示されます。また、引数としてnullを指定してみます。これは、いくつかの場所で行われます。

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

これは同じ結果になります。なぜこれが私に失敗するのですか?

編集:私は私の目標を十分に説明していないことが私に指摘されました。上で述べたように、目標は、このサンプルオブジェクトのように、任意のオブジェクトのフィールドを反復処理することです。

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

そして、元の質問でも、「フィールドをいくつかの新しい値に設定したい」と書いています。これは、「ob」オブジェクトのフィールドを反復処理して、新しい値に設定したいことを意味します。

ありがとうございました

回答

1 JonSkeet Dec 13 2020 at 22:26

なぜこれが私に失敗するのですか?

書くのと同じ理由で

ob.DeclarativeSecn = "new value";

少なくともあなたが与えた例では、コンパイル時に失敗するでしょう。オブジェクトは匿名型であり、匿名型のプロパティにはゲッターしかありません。プロパティに新しい値を設定することはできません。後でプロパティを変更できるようにする場合は、匿名タイプを使用しないでください。

あなたの質問はオブジェクトのプロパティを反復することについて話していましたが、次のことに注意してください。

  • 印刷するときは、すべてのプロパティにゲッターがあると想定しています。それは一般的に真実ですが、常にではありません
  • 新しい値を設定するときは、すべてのプロパティにゲッターがあり、それらが文字列プロパティである想定しています。

これらの仮定はどちらも一般的に正しくありません。したがって、任意のオブジェクトを処理できるようにする場合は、さらにチェックを追加する必要があります。

ThomasWeller Dec 13 2020 at 22:31

匿名型は、最初に型を明示的に定義しなくても、読み取り専用プロパティのセットを単一のオブジェクトにカプセル化する便利な方法を提供します。

強調鉱山。

読み取り専用プロパティに値を設定できないようです。合理的に聞こえます。