namespace MyDict
{
public delegate void EntryChanged(Object sender, DictionaryChanged e);
public class ExtDictionary<TKey, TValue> : Dictionary<TKey, TValue>
{
/// <summary>
/// Die zuletzt benutzter Key und Value
/// </summary>
private KeyValuePair<TKey, TValue> LastUsed;
/// <summary>
/// Legt die Maximal länge des Dictionaries fest.
/// Länge von 0 bedeutet dass es keine Längeneinschränkung gibt.
/// </summary>
private uint MaxLen
{
get;
set;
}
/// <summary>
/// [COLOR="Red"]Eventhandler, der beim ändern der Werte[/COLOR]
/// [COLOR="Red"]in der Dictionary eine Benachrichtung aussenden kann.[/COLOR]
/// </summary>
public event EntryChanged Changed;
/// <summary>
/// Überprüft ob die Value exisiert. Gibt diese auch als out zurück.
/// </summary>
/// <param name="key">Der gesuchter schlüssel</param>
/// <param name="val">Wertparameter der einen Schlüssel zugewiesen wurde</param>
/// <returns>True wenn es den Key gibt.</returns>
public new Boolean TryGetValue(TKey key, out TValue val)
{
val = default(TValue);
try
{
if (base.TryGetValue(key, out val))
return true;
}
catch
{ }
return false;
}
/// <summary>
/// Ruft den Wert ab der dem angegebenen Schlüssel ist oder legt diesem fest.
/// </summary>
/// <param name="key">Der Schlüssel des abrufenden oder festlegenden Wertes.</param>
/// <returns>Wert der den Schlüssel zugewiesen wurde.</returns>
public new TValue this[TKey key]
{
get
{
TValue val;
if (TryGetValue(key, out val))
return val;
throw new KeyNotFoundException("Offenbar existiert der Schlüssel " + key.ToString() + " nicht.");
}
set
{
try
{
this.Add(key, value);
}
catch
{
throw new ArgumentException("Es konnte kein Eintrag in der ExtDictionary erstellt werden.");
}
}
}
/// <summary>
/// Überschriebene Methode zur einfügung des Parameters.
/// Hierbei muss man beachten dass es ein Indexer für das Schreiben
/// der Werte eingesetzt wird und nicht die "base.Add" Methode.
/// </summary>
/// <param name="key">Schlüssel der Dictionary.</param>
/// <param name="val">Wert</param>
public new void Add(TKey key, TValue val)
{
if (MaxLen != 0 && (base.Count + 1) > MaxLen)
throw new ArgumentOutOfRangeException("ExtDictionary", "Maximale Länge des Dictionary wurde erreicht.\r\nKein neuer Wert zum einfügen möglich.");
base[key] = val;
LastUsed = new KeyValuePair<TKey, TValue>(key, val);
[COLOR="Red"]OnChanged();[/COLOR]
///Reset Key und Value Werte
LastUsed = new KeyValuePair<TKey, TValue>();
}
/// <summary>
/// Löst ein Eventhandler aus.
/// </summary>
[COLOR="Red"]public virtual void OnChanged()[/COLOR]
{
///Eigene Klasse für diesen Event dass vom EventArgs erbt.
DictionaryChanged e = new DictionaryChanged();
e.Key = LastUsed.Key;
e.Value = LastUsed.Value;
if(Changed != null)
[COLOR="Red"] Changed(this, e);[/COLOR] //<-- Hier Löse ich ereignis aus!
}
/// <summary>
/// Erweiterter Dictionary dass auch einen Eventhandler
/// hat der die benachrichtigung übernimmt, falls es ein
/// Wert hinzugefügt/geändert wurde.
/// </summary>
/// <param name="len">Maximal erlaubte Länge des Dictionary.</param>
public ExtDictionary(uint max)
{
this.MaxLen = max;
}
/// <summary>
/// Erweiterter Dictionary dass auch einen Eventhandler
/// hat der die benachrichtigung übernimmt, falls es ein
/// Wert hinzugefügt/geändert wurde.
/// </summary>
public ExtDictionary()
{
this.MaxLen = 0;
}
}
}