В моята функция получавам обекти, изпълняващи 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“ няма метод за получаване.
Търсенето на „nameof limitations“ не ми даде никакъв отговор за този проблем, освен това официалните забележки не съдържат ограничение относно property getters:
... Струва си да се спомене следното, което създава грешки: предварително дефинирани типове (например int или void), nullable типове (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)
.
Както и да е, намерих отговора, тази грешка „getter“ е грешка на ReSharper (вижте собствения ми отговор).
nameof(panelControl.IsNextEntityExists)
? - person Gusdor   schedule 04.03.2016panelControl
катоFrameworkElement
. Физически това е просто потребителскиUserControl
, създаден от клиент, който използва моя общ контрол. Всеки клиент създава свой собствен потребителски контрол и го предава на мен, така че комуникираме чрез интерфейс. - person Sam   schedule 04.03.2016IMediaPanel
и вие заявявате, че имате нужда от имената по време на init - По време на инициализацията трябва да посоча имена на свойства - person Gusdor   schedule 04.03.2016nameof(ClientUserControl1.IsNextEntityExists)
илиnameof(ClientUserControl2.IsNextEntityExists)
, но не мога да знам какъв конкретен тип клиент ще ми предаде, тъй като клиентите използват моя контрол като услуга, но не и обратното. Всичко, което знам в моя контрол, е конвенцията, че те трябва да внедрят този конкретен интерфейс. - person Sam   schedule 04.03.2016