this
на компиляторе C++ компилятор C++ будет тихо поиск для символа, если это сразу не найдет его. Иногда, большую часть времени, это хорошо:
, Но иногда, Вы просто не хотите, чтобы компилятор предположил. Вы хотите компилятор к погрузке правильный символ и не другой.
Для меня , те времена - когда в рамках метода я хочу получить доступ к членскому методу или членской переменной. Я просто не хочу некоторый случайный символ, взятый просто, потому что я записал printf
вместо print
. this->printf
не скомпилировал бы.
Дело в том, что, с библиотеками прежней версии C (В§), унаследованный код несколько записанных годы назад (§§), или независимо от того, что могло произойти на языке, где копия/вставка является устаревшей, но все еще активной функцией, иногда, говоря компилятору не играть остроумие, является прекрасной идеей.
Это причины, которые я использую this
.
(В§) это - все еще своего рода тайна мне, но я теперь задаюсь вопросом, включаете ли факт Вы < окна h> заголовок в Вашем источнике, причина, все символы библиотек C прежней версии загрязнят Ваше глобальное пространство имен
(§§), понимая, что "необходимо включать заголовок, но который включая этот заголовок повредит код, потому что это использует некоторый немой макрос с родовым названием", один из тех русская рулетка моменты жизни кодера
Следует переопределить защищенный метод BindingList.InsertItem
( MSDN ). Добавить
, Вставить
и все это вызывает это для фактического добавления и создания соответствующих событий. Поднимите свое событие, а затем вызовите base.InsertItem
, чтобы сделать все остальное.
I have done something similar as I needed to capture the ItemAdding and ItemAdded event
The magic bit is the new keyword that will override the inherited class' method
// class that inherits generic List and hides the add item
public class ListWithEvents<T> : List<T>
{
public event EventHandler ItemAdding;
public event EventHandler ItemAdded;
public new void Add(T item)
{
if (ItemAdding != null)
ItemAdding(item, EventArgs.Empty);
base.Add(item);
if (ItemAdded != null)
ItemAdded(item, EventArgs.Empty);
}
}
// Using the class
protected override void OnLoad(EventArgs e)
{
ListWithEvents<int> lstI = new ListWithEvents<int>();
lstI.ItemAdded += new EventHandler(lstI_ItemAdded);
lstI.ItemAdding += new EventHandler(lstI_ItemAdding);
}
void lstI_ItemAdding(object sender, EventArgs e)
{
throw new NotImplementedException();
}
void lstI_ItemAdded(object sender, EventArgs e)
{
throw new NotImplementedException();
}
Самый простой путь - создать подкласс класса Collection
. Это класс коллекции в BCL, разработанный для создания подклассов и переопределения его поведения. Создание подкласса других типов, таких как BindingList
или List
, только вызовет у вас боль.
После создания подкласса Collection
вы можете переопределить Добавить и создать собственное событие для прослушивания.
Что-то вроде:
public class PreProcessBindingList<T> : Collection<T>
{
public AddingNewEventHandler AddingNew;
public override void Add(T item)
{
PreProcess(item);
base.Add(item);
AddingNewEventHandler addingNew = this.AddingNew;
if (addingNew != null)
{
addingNew(this, new AddingNewEventArgs(item));
}
}
}
Правильный способ сделать это - расширить Collection
и переопределить метод InsertItem
. Вы можете вызвать свое событие там перед вызовом base.InsertItem.
Используйте библиотеку коллекций C5 . Коллекции C5
уже настроены, чтобы иметь возможность запускать события для нескольких операций, включая очистку коллекции, добавление элементов, удаление элементов, вставку элементов и общие изменения коллекции.
Также, коллекции библиотеки C5 реализуют интерфейсы System.Collection.Generic
ICollection
и IList
там, где это необходимо, и поэтому могут быть исключены в качестве реализации, даже если библиотека только ожидает, например, SCG.ICollection
.
РЕДАКТИРОВАТЬ: Я забыл упомянуть часть ваших требований; многие из упомянутых выше событий являются отменяемыми и запускаются до того, как действие повлияет на базовую коллекцию, что позволяет вносить изменения или отклонять добавления, удаления и т. д.
Я забыл упомянуть часть ваших требований; многие из упомянутых выше событий являются отменяемыми и запускаются до того, как действие повлияет на базовую коллекцию, что позволяет вносить изменения или отклонять добавления, удаления и т. д. Я забыл упомянуть часть ваших требований; многие из упомянутых выше событий являются отменяемыми и запускаются до того, как действие повлияет на базовую коллекцию, что позволяет вносить изменения или отклонять добавления, удаления и т. д.Используйте Наблюдаемый сбор. В ней есть события, которые отслеживаются при изменении коллекции. Я считаю, что в первую очередь она используется для WPF, но я использовал ее и в проектах ASP.NET.