您的代码不起作用,因为您将键“stat”添加到Dictionary
具有赋值时 Status 具有的任何值。当您稍后更新该键的值时,它不会自动更新您的属性。您正在将某个时间点的属性值添加到 中Dictionary
,而不是属性本身。
使用标准无法实现您想要做的事情Dictionary
。不过,您有几个看起来并不可怕的选择。
可观察字典
请参阅此博客文章和此stackoverflow 线程。
总体思路是编写一个继承自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
当 getter 尝试访问该键时您会得到一个。不过,我认为这是一个很小的缺点。