В моей функции я получаю объекты, реализующие интерфейс IMediaPanel
:
public interface IMediaPanel
{
bool IsListsAreaVisible { get; }
bool IsNextEntityExists { set; }
}
private void InitConnections(IMediaPanel panelControl)
{
// Initialization logic
}
При инициализации мне нужно указать имена свойств, для чего я использую C# 6.0 nameof
ключевое слово:
nameof(IMediaPanel.IsListsAreaVisible)
Это отлично работает, но с этим выражением:
nameof(IMediaPanel.IsNextEntityExists)
Visual Studio показывает мне следующую ошибку:
Свойство MyNamespace.IMediaPanel.IsNextEntityExists не имеет геттера.
Поиск по "имя ограничений" не дал мне никакого ответа по этой проблеме, более того, официальные комментарии не содержат ограничений относительно геттеров свойств:
... Стоит упомянуть следующее, что вызывает ошибки: предопределенные типы (например, int или void), типы, допускающие значение NULL (Point?), типы массивов (Customer[,]), типы указателей (Buffer*), квалифицированный псевдоним (A ::B) и несвязанные универсальные типы (Dictionary‹,>), символы предварительной обработки (DEBUG) и метки (loop:). ...
Может ли кто-нибудь объяснить, почему существует это ограничение и есть ли какие-либо упоминания об этом? Какая причина может заставить ключевое слово nameof
использовать средство получения экземпляра свойства, в то время как оно должно (как я предполагаю) просто использовать информацию общего типа через Reflection? (по крайней мере, в этом конкретном случае, когда я не могу непосредственно указать на свойство экземпляра из-за неизвестного типа, я просто знаю, что этот экземпляр реализует интерфейс)
Обновлять
Чтобы объяснить, почему предложение @Gusdor из комментариев не работает, мне нужно уточнить, как я вызываю функцию InitConnections
(в упрощенной форме):
public void Init(FrameworkElement panelControl)
{
// ... Other logic ...
this.InitConnections((IMediaPanel) panelControl);
}
Поэтому, если я использую nameof(panelControl.IsNextEntityExists)
внутри функции Init, это приведет к ошибке, потому что FrameworkElement не содержит пользовательского свойства IsNextEntityExists
клиента. И если я использую это же выражение внутри функции InitConnections, я получаю ошибку о геттере - так же, как и с nameof(IMediaPanel.IsNextEntityExists)
.
Во всяком случае, я нашел ответ, эта ошибка «геттера» является ошибкой ReSharper (см. Мой собственный ответ).
nameof(panelControl.IsNextEntityExists)
работает? - person Gusdor   schedule 04.03.2016panelControl
какFrameworkElement
. Физически это просто кастомныйUserControl
, созданный клиентом, который использует мой общий элемент управления. Каждый клиент создает свой собственный пользовательский элемент управления и передает его мне, поэтому мы общаемся через интерфейс. - person Sam   schedule 04.03.2016IMediaPanel
, и вы заявляете, что вам нужны имена во время инициализации - Во время инициализации мне нужно указать имена свойств - person Gusdor   schedule 04.03.2016nameof(ClientUserControl1.IsNextEntityExists)
илиnameof(ClientUserControl2.IsNextEntityExists)
, но я не могу знать, какой конкретный тип клиента передаст мне, потому что клиенты используют мой элемент управления как службу, а не наоборот. Все, что я знаю внутри своего элемента управления, это соглашение о том, что они должны реализовать этот конкретный интерфейс. - person Sam   schedule 04.03.2016