之所以创建带事件的泛型集合,可增加扩展性和灵活性,方便项目定制。
以下定义一个名为ListWithEvents的带事件的泛型集合
public class ListWithEvents<T> : Collection<T>
{
public event Action<T> ItemAdded;
public event Action<T> ItemRemoved;
protected override void ClearItems()
{
foreach (var item in this)
{
OnItemRemoved(item);
}
base.ClearItems();
}
private void OnItemRemoved(T item)
{
if (ItemRemoved != null)
{
ItemRemoved(item);
}
}
protected override void InsertItem(int index, T item)
{
base.InsertItem(index, item);
OnItemAdded(item);
}
private void OnItemAdded(T item)
{
if (ItemAdded != null)
{
ItemAdded(item);
}
}
protected override void RemoveItem(int index)
{
OnItemRemoved(this[index]);
base.RemoveItem(index);
}
protected override void SetItem(int index, T item)
{
OnItemRemoved(this[index]);
base.SetItem(index, item);
OnItemAdded(item);
}
}
调用方式:
//初始化自定义集合
protected readonly ListWithEvents<IFigureStyle> list = new ListWithEvents<IFigureStyle>();
//初始化集合中的ItemAdded事件
public StyleManager(Drawing drawing)
{
list.ItemAdded += OnStyleAdded;
}
//事件处理方法
private void OnStyleAdded(IFigureStyle style)
{
if (style.Name.IsEmpty())
{
style.Name = GenerateUniqueName();
}
style.StyleManager = this;
}
//事件触发
(new IFigureStyle[]
{
freePointStyle,
pointOnFigureStyle,
dependentPointStyle,
lineStyle,
shapeStyle,
shapeWithLineStyle,
textStyle,
headerStyle,
hyperLinkStyle,
}).ForEach(list.Add);
//定义ForEach泛型方法
public static void ForEach<T>(this IEnumerable<T> items, Action<T> action)
{
foreach (var item in items)
{
action(item);
}
}