我正在编写一个类,它根据属性的可访问性为属性生成WPF绑定。这是关键方法:
static Binding getBinding(PropertyInfo prop)
{
var bn = new Binding(prop.Name);
bn.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
if (prop.CanRead && prop.CanWrite)
bn.Mode = BindingMode.TwoWay;
else if (prop.CanRead)
bn.Mode = BindingMode.OneWay;
else if (prop.CanWrite)
bn.Mode = BindingMode.OneWayToSource;
return bn;
}
但是,这没有按预期工作。如果它应该是假的,CanWrite
是true
。例如,对于此属性:
abstract class AbstractViewModel {
public virtual string DisplayName { get; protected set; }
}
class ListViewModel : AbstractViewModel {
//does not override DisplayName
}
我发现DisplayName
的{{1}}属性同时为ListViewModel
和CanRead
。但是,如果我致电CanWrite
,则只列出prop.GetAccessors()
访问者。
这里发生了什么?如果不是财产的保护级别,get_DisplayName()
和CanRead
表示什么?什么是我的方法的正确实现?
答案 0 :(得分:13)
CanRead和CanWrite表示什么?
如果您有类似的问题,请先查看文档。
如果该属性没有
get
访问者,则无法读取。
如果该属性没有
set
访问者,则无法写入。
因此,属性指示是否存在get
和set
访问者,而不是其保护级别。其中一个原因是Reflection不知道你从哪里调用它,所以它不知道你是否可以实际访问访问器。
您可以做的是确定您是否可以访问访问者,以致电GetGetMethod()
和GetSetMethod()
。如果该媒体资源没有公开的get
/ set
访问者,则会返回null
。