CanRead和CanWrite对PropertyInfo意味着什么?

Oli*_*ver 3 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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

class ListViewModel : AbstractViewModel {
    //does not override DisplayName
}
Run Code Online (Sandbox Code Playgroud)

我发现DisplayNamea 的属性ListViewModelCanReadCanWrite.但是,如果我打电话prop.GetAccessors(),则只get_DisplayName()列出访问者.

这里发生了什么?如果不是财产的保护等级,做什么CanReadCanWrite表明什么?什么是我的方法的正确实现?

svi*_*ick 13

CanRead和CanWrite表示什么?

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

CanRead:

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

CanWrite:

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

因此,属性说明是否存在getset访问,他们的保护水平今非昔比.其中一个原因是Reflection不知道你从哪里调用它,所以它不知道你是否可以实际访问访问器.

你可以做的是找出你是否可以访问访问者是要打电话GetGetMethod()GetSetMethod().如果该物业没有公共get/ set访问者,他们将返回null.