4

我正在编写一个类,该类根据其可访问性为属性生成 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;
}

但是,这并没有按预期工作。CanWritetrue什么时候应该是假的。例如,对于这个属性:

abstract class AbstractViewModel {
    public virtual string DisplayName { get; protected set; }
}

class ListViewModel : AbstractViewModel {
    //does not override DisplayName
}

我发现 a 的DisplayName属性ListViewModelCanReadand CanWrite。但是,如果我调用prop.GetAccessors(),则仅get_DisplayName()列出访问者。

这里发生了什么?如果不是财产的保护级别,做什么CanRead和指示?CanWrite我的方法的正确实现是什么?

4

1 回答 1

17

CanRead 和 CanWrite 表示什么?

如果您有类似的问题,您应该首先查看文档。

CanRead

如果属性没有get访问器,则无法读取。

CanWrite

如果该属性没有set访问器,则无法写入。

因此,这些属性表示是否存在一个getset访问器,而不是它们的保护级别。造成这种情况的一个原因是 Reflection 不知道您从哪里调用它,因此它不知道您是否可以实际访问访问器。

您可以做的是找出您是否可以访问访问器是调用GetGetMethod()GetSetMethod()。如果该属性没有公共get/set访问器,它们将返回null.

于 2012-05-05T11:52:24.207 回答