私の目標は、コレクションオブジェクトを拡張して、アイテムがコレクションに追加、更新、または削除されたときにフラグを立てることをサポートすることです。MSDNの記事では、特定のタイプに拡張する例(例2)を提供しています。私はそれをジェネリックに保ちたいので、私が持っているすべてのコレクションに新しいクラスを実装する必要はありません。
これが私がこれまでに持っているものです:
public class ChangedEventArgs<T> : EventArgs
{
public readonly T ChangedItem;
public readonly T ReplacedWith;
public readonly ChangeType ChangeType;
public ChangedEventArgs(ChangeType change, T item, T replacement)
{
ChangeType = change;
ChangedItem = item;
ReplacedWith = replacement;
}
}
public enum ChangeType
{
Added,
Removed,
Replaced,
Cleared
};
class CollectionChangeTracked<T> : Collection<T>
{
public event EventHandler<ChangedEventArgs<T>> Changed;
protected override void InsertItem<TParam>(int index, TParam newItem)
{
base.InsertItem(index, newItem);
EventHandler<ChangedEventArgs<T>> temp = Changed;
if (temp != null)
{
temp(this, new ChangedEventArgs<T>(ChangeType.Added, newItem, null));
}
}
protected override void SetItem<TParam>(int index, TParam newItem)
{
string replaced = Items[index];
base.SetItem(index, newItem);
EventHandler<ChangedEventArgs<T>> temp = Changed;
if (temp != null)
{
temp(this, new ChangedEventArgs(ChangeType.Replaced, replaced, newItem));
}
}
protected override void RemoveItem<TParam>(int index)
{
TParam removedItem = Items[index];
base.RemoveItem(index);
EventHandler<ChangedEventArgs<T>> temp = Changed;
if (temp != null)
{
temp(this, new ChangedEventArgs<T>(ChangeType.Removed, removedItem, null));
}
}
protected override void ClearItems()
{
base.ClearItems();
EventHandler<ChangedEventArgs<T>> temp = Changed;
if (temp != null)
{
temp(this, new ChangedEventArgs(ChangeType.Cleared, null, null));
}
}
}
質問:次の行でエラーが発生します:base.InsertItem(index、newItem)無効な引数がありますが、それ以上はありません。SetItemとRemoveItemで同じ問題。
コンパイルする更新されたコード:
public class ChangedEventArgs<T> : EventArgs
{
public readonly T ChangedItem;
public readonly T? ReplacedWith;
public readonly ChangeType ChangeType;
public ChangedEventArgs(ChangeType change, T item, T? replacement)
{
ChangeType = change;
ChangedItem = item;
ReplacedWith = replacement;
}
}
public enum ChangeType
{
Added,
Removed,
Replaced,
Cleared
};
class CollectionChangeTracked<T> : Collection<T>
{
public event EventHandler<ChangedEventArgs<T>> Changed;
protected override void InsertItem(int index, T newItem)
{
base.InsertItem(index, newItem);
EventHandler<ChangedEventArgs<T>> temp = Changed;
if (temp != null)
temp(this, new ChangedEventArgs<T>(ChangeType.Added, newItem, default(T)));
}
protected override void SetItem(int index, T newItem)
{
T replaced = Items[index];
base.SetItem(index, newItem);
EventHandler<ChangedEventArgs<T>> temp = Changed;
if (temp != null)
temp(this, new ChangedEventArgs<T>(ChangeType.Replaced, replaced, newItem));
}
protected override void RemoveItem(int index)
{
T removedItem = Items[index];
base.RemoveItem(index);
EventHandler<ChangedEventArgs<T>> temp = Changed;
if (temp != null)
temp(this, new ChangedEventArgs<T>(ChangeType.Removed, removedItem, null));
}
protected override void ClearItems()
{
base.ClearItems();
EventHandler<ChangedEventArgs<T>> temp = Changed;
if (temp != null)
temp(this, new ChangedEventArgs<T>(ChangeType.Cleared, null, null));
}