Dictionary
割り当てが行われたときにステータスの値に関係なく、キー「stat」を追加するため、コードは機能しません。後でそのキーの値を更新しても、プロパティは自動的に更新されません。ある時点でのプロパティの値を に追加していますがDictionary
、プロパティ自体は追加していません。
あなたがやりたいことは、標準では不可能ですDictionary
。ただし、ひどいとは思われないオプションがいくつかあります。
オブザーバブル ディクショナリ
このブログ投稿とこのスタックオーバーフロー スレッドを参照してください。
IDictionary<TKey, TValue>
一般的な考え方は、 、INotifyCollectionChanged
、およびを継承するクラスを作成することINotifyPropertyChanged
です。
これにより、理論的にはいくつかのプロパティやその他のやりたいことを更新できるイベントハンドラーを作成できるいくつかのフックが得られます。
コードをリファクタリングする
上記が気に入らない場合は、コードを少しリファクタリングできます。
このことを考慮:
public class Foo
{
public Dictionary<string, object> CodeMap;
public int Status
{
get
{
int status;
if (int.TryParse(CodeMap["stat"].ToString(), out status))
{
return status;
}
else
{
throw new Exception("Status has a non-numeric value");
}
}
set
{
CodeMap["stat"] = value;
}
}
public Foo()
{
CodeMap = new Dictionary<string, object>();
}
}
次に、同じ呼び出しを行うことができます。
Foo foo = new Foo();
foo.CodeMap["stat"] = 27;
Console.WriteLine(foo.Status.ToString()); // prints 27
うまくいけば、これが機能する理由はかなり明白です。これで、プロパティは実際に を参照しDictionary
ます。KeyNotFoundException
ゲッターがそのキーにアクセスしようとしたときに取得するため、以前と同じ方法で初期値を追加できないことに注意してください。ただし、これはかなり小さな欠点だと思います。