CanRead和CanWrite对PropertyInfo意味着什么?

时间:2012-05-05 11:48:22

标签: c# reflection

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

我发现DisplayName的{​​{1}}属性同时为ListViewModelCanRead。但是,如果我致电CanWrite,则只列出prop.GetAccessors()访问者。

这里发生了什么?如果不是财产的保护级别,get_DisplayName()CanRead表示什么?什么是我的方法的正确实现?

1 个答案:

答案 0 :(得分:13)

  

CanRead和CanWrite表示什么?

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

CanRead

  

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

CanWrite

  

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

因此,属性指示是否存在getset访问者,而不是其保护级别。其中一个原因是Reflection不知道你从哪里调用它,所以它不知道你是否可以实际访问访问器。

您可以做的是确定您是否可以访问访问者,以致电GetGetMethod()GetSetMethod()。如果该媒体资源没有公开的get / set访问者,则会返回null