События расширения .NET - PullRequest
       14

События расширения .NET

2 голосов
/ 17 сентября 2009

Я хочу добавить события в некоторые встроенные классы .NET. Например, я хочу добавить следующие события в общий List(T):

  • ItemAdded
  • ItemRemoved
  • ListChanged
  • и т.д.

Я могу придумать несколько способов сделать это, но я не уверен, какой подход лучше.

  1. Я мог бы использовать « события расширения », то есть, если есть такая вещь или способ использовать методы расширения для симуляции событийной функциональности.
  2. Я мог бы унаследовать от List(T) и переопределить необходимые методы и свойства.
  3. Я мог бы унаследовать от List(T) и shadow необходимые методы и свойства.
  4. Я мог бы создать новый класс, который реализует IList(T), а затем обернуть оставшуюся функциональность List(T), которая отсутствует IList(T).

Очевидно, что вариант 4 - самая большая работа, которая не имеет большого значения, если бы я хотел расширить только один класс. Однако я также хочу избежать неприятных побочных эффектов.

Каковы преимущества, недостатки и предостережения для каждого подхода?

Примечание. Меня не особо интересует IList (T). Я обнаружил, что хочу добавить «события расширения» и к другим классам.

Ответы [ 2 ]

6 голосов
/ 17 сентября 2009
  1. Нет такой вещи, как "события расширения", и вы не можете использовать методы расширения для имитации этого: события расширения не могут добавлять состояние к существующим классам, что вам и требуется.

  2. Я думаю, что вы имеете в виду переопределить вместо перегрузка . Это будет работать, это немного неуклюже - и означает, что вы не можете использовать обычный ToList из LINQ и т. Д., Потому что тогда вы просто получите List<T>.

  3. Затенение противнее переопределения. Это означает, что события могут возникать или не вызываться в зависимости от того, как вызывающая сторона вызывает метод. Ик.

  4. Это было бы предпочтительнее, и вы можете добавить метод расширения к List<T>, чтобы обернуть его. Одним из недостатков является то, что если кто-то еще «знает» о коллекции развернутой , вы не заметите изменения, сделанные таким образом.

Вы смотрели на ObservableCollection<T>? Обратите внимание, что это будет копировать из списка, если вы предоставите его в конструкторе, а не обтекание списка.

2 голосов
/ 17 сентября 2009

«событий расширения» не существует, равно как и свойств расширения или чего-либо другого, кроме методов расширения. Лично я хотел бы видеть свойства расширения (учитывая, что они являются просто обертками для функций), но я не уверен, как вы могли бы реализовывать события расширения в статической манере, которой требуют расширения.

Ничто не мешает вам добавить эти события в сам класс. Тем не менее, вы можете добиться большего успеха, глядя на BindingList<T>, так как он больше соответствует деятельности по мониторингу, которую вы, похоже, хотите делать.

...