【发布时间】:2012-05-05 19:57:26
【问题描述】:
我正在编写一个类,该类根据属性的可访问性生成 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
}
我发现ListViewModel 的DisplayName 属性既是CanRead 又是CanWrite。但是,如果我调用prop.GetAccessors(),只会列出get_DisplayName() 访问器。
这里发生了什么? CanRead 和 CanWrite 表示什么,如果不是财产的保护级别?我的方法的正确实现是什么?
【问题讨论】:
-
好吧,让我们从 AbstractViewModel 不是抽象的事实开始...也就是说,我认为您不能期望不正确的实现(没有派生实现的虚拟)会产生确定性行为。
-
我认为您真正的问题是:如何检查可访问的 getter 和 setter,对吗?如果是这样,Jon Skeet 在这里回答:stackoverflow.com/a/302492/44372
-
@JaimieOlivares 虚拟方法和属性不必被覆盖。或者,您可以覆盖它们。不过你是对的,
AbstractViewModel实际上在我的应用程序中被声明为抽象...我将编辑问题。
标签: c# reflection