Общая функция для универсального интерфейса - PullRequest
1 голос
/ 25 июля 2011

РЕДАКТИРОВАТЬ Имя свойства с ошибкой в ​​примере

Давайте предположим, что у нас есть такие интерфейсы

public interface IBase {}
public interface IItf_1: IBase {}
public interface IItf_2: IBase {}
public interface IItf_3: IBase {}

public interface IInterfaceHolder<T>: IBase, INotifyPropertyChanged {
  // Changes to this property caused raise of the PropertyChanged event
  bool Checked { get; set; }
  T Item { get; }
}

public interface ISomeFunnyInterface: INotifyPropertyChanged {
  IEnumerable<IInterfaceHolder<IItf_1>> Collection_1 { get; }
  IEnumerable<IInterfaceHolder<IItf_2>> Collection_2 { get; }
  IEnumerable<IInterfaceHolder<IItf_3>> Collection_3 { get; }
}

Идея состоит в том, чтобы туннелировать PropertyChanged от каждого свойства Checked к PropertyChaned, созданному из ISomeFunnyInterface, с соответствующим именем свойства (некоторые отличные от «Checked»).

Очевидным решением является обработка каждой отправки PropertyChanged с помощью интерфейса IInterfaceHolder. Но проблема в том, что я пишу обработчик:

private void GenericSelectorSelected_PropertyChanged(object sender, PropertyChangedEventArgs e) {
    dynamic el = (dynamic)sender;

    // here an exception is thrown, because sender (or more correctly 'el') is
    // handled as IBase, and not as IInterfaceHolder
    if (el.Checked) {
    }
    else {
    }
}

Как решить эту проблему? Как заставить его работать без необходимости написания отдельных обработчиков для каждого IInterfaceHandler <.>

1 Ответ

0 голосов
/ 25 июля 2011

Если вам нужна только общая реализация интерфейса, а не то, что вы делаете, вы можете использовать ImpromptuInterface (доступно через nuget).Это позволяет вам создать подкласс DynamicObject и затем дать ему статический интерфейс.

IItf_1 test1 = Impromptu.ActLike<IItf_1>(myDynamicObject);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...