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

但是,这并没有按预期工作。 CanWritetrue 当它应该是假的。例如,对于此属性:
abstract class AbstractViewModel {
    public virtual string DisplayName { get; protected set; }
}

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

我发现 DisplayNameListViewModel 属性既是 CanRead 又是 CanWrite 。但是,如果我调用 prop.GetAccessors() ,则只会列出 get_DisplayName() 访问器。

这里发生了什么?如果不是属性(property)的保护级别,CanReadCanWrite 表示什么?我的方法的正确实现是什么?

最佳答案



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

CanRead :



CanWrite :



因此,属性指示是否存在 getset 访问器,而不是它们的保护级别。原因之一是 Reflection 不知道您从哪里调用它,因此它不知道您是否可以实际访问访问器。

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

10-07 20:18