【问题标题】:What do CanRead and CanWrite mean for a PropertyInfo?CanRead 和 CanWrite 对 PropertyInfo 意味着什么?
【发布时间】: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;
}

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

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

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

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

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

【问题讨论】:

  • 好吧,让我们从 AbstractViewModel 不是抽象的事实开始...也就是说,我认为您不能期望不正确的实现(没有派生实现的虚拟)会产生确定性行为。
  • 我认为您真正的问题是:如何检查可访问的 getter 和 setter,对吗?如果是这样,Jon Skeet 在这里回答:stackoverflow.com/a/302492/44372
  • @JaimieOlivares 虚拟方法和属性不必被覆盖。或者,您可以覆盖它们。不过你是对的,AbstractViewModel 实际上在我的应用程序中被声明为抽象...我将编辑问题。

标签: c# reflection


【解决方案1】:

CanRead 和 CanWrite 表示什么?

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

CanRead:

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

CanWrite:

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

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

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

【讨论】:

  • 我明白了。你说反射不知道从哪里调用它,但它设法找出从调用位置可见的访问器,所以我认为CanReadCanWrite 的这个定义有点奇怪。谢谢你的回答。
  • @Oliver - 不是真的。所有CanWrite 都在说一个二传手。
  • @Oliver,如果你的意思是GetAcessors() 只返回你可以访问的访问器,那不是真的。再次阅读文档,您会发现它始终只返回公共访问器,即使您能够访问更多。
猜你喜欢
  • 2015-10-09
  • 2015-04-24
  • 1970-01-01
  • 2011-12-28
  • 2020-10-12
  • 2011-06-11
  • 2010-10-02
  • 2013-01-16
  • 1970-01-01
相关资源
最近更新 更多