我正在编写一个类,它根据属性的可访问性为属性生成 WPF 绑定(bind)。下面是关键方法:
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
的 ListViewModel
属性既是 CanRead
又是 CanWrite
。但是,如果我调用 prop.GetAccessors()
,则只会列出 get_DisplayName()
访问器。这里发生了什么?如果不是属性(property)的保护级别,
CanRead
和 CanWrite
表示什么?我的方法的正确实现是什么? 最佳答案
如果您有这样的问题,您应该首先查看文档。
CanRead
:
CanWrite
:
因此,属性指示是否存在 get
和 set
访问器,而不是它们的保护级别。原因之一是 Reflection 不知道您从哪里调用它,因此它不知道您是否可以实际访问访问器。
您可以做的是找出是否可以访问访问器是调用 GetGetMethod()
和 GetSetMethod()
。如果该属性没有公共(public) get
/set
访问器,它们将返回 null
。