在我的函数中,我收到实现IMediaPanel
接口的对象:
public interface IMediaPanel
{
bool IsListsAreaVisible { get; }
bool IsNextEntityExists { set; }
}
private void InitConnections(IMediaPanel panelControl)
{
// Initialization logic
}
在初始化期间,我需要指定属性的名称,为此我使用 C# 6.0nameof
关键字:
nameof(IMediaPanel.IsListsAreaVisible)
这很好用,但是使用以下表达式:
nameof(IMediaPanel.IsNextEntityExists)
Visual Studio 向我显示以下错误:
'MyNamespace.IMediaPanel.IsNextEntityExists' 属性没有 getter。
搜索“限制名称”没有给我任何关于这个问题的答案,而且官方评论不包含关于属性获取器的限制:
... 以下是值得一提的产生错误的类型:预定义类型(例如,int 或 void)、可空类型(Point?)、数组类型(Customer[,])、指针类型(Buffer*)、限定别名(A ::B) 和未绑定的泛型类型 (Dictionary<,>)、预处理符号 (DEBUG) 和标签 (loop:)。...
谁能解释为什么有这个限制,是否有任何参考?什么原因可以强制nameof
关键字使用属性的实例获取器,而它应该(我猜)只是通过反射使用一般类型信息?(至少在这种特殊情况下,当我由于未知类型而无法直接指向实例的属性时,我只知道该实例实现了接口)
更新
为了解释为什么@Gusdor 的评论建议不起作用,我需要澄清我如何调用InitConnections
函数(以简化形式):
public void Init(FrameworkElement panelControl)
{
// ... Other logic ...
this.InitConnections((IMediaPanel) panelControl);
}
因此,如果我nameof(panelControl.IsNextEntityExists)
在Init函数中使用,则会产生错误,因为 FrameworkElement 不包含自定义客户端的IsNextEntityExists
属性。如果我在InitConnections函数中使用相同的表达式,我会收到关于 getter 的错误 - 与nameof(IMediaPanel.IsNextEntityExists)
.
无论如何,我找到了答案,这个“getter”错误是 ReSharper 的错误(请参阅我自己的答案)。