using System.Collections;
using System.Collections.Generic;
using System.Reflection;
namespace ProjectX
{
///
/// Delegate Set.
/// A delegate container which provides attach and invoke methods.
///
public class DelegateSet
{
///
/// Delegate func.
/// All func-implementation method must use this declaration.
///
public delegate object Handler(object context, object param);
private Dictionary mHandlers;
public DelegateSet()
{
this.mHandlers = new Dictionary();
}
public void Attach(string name, Handler func)
{
if (string.IsNullOrEmpty(name) || func == null)
throw new System.ArgumentNullException();
Handler handler = null;
this.mHandlers.TryGetValue(name, out handler);
if (handler == null)
{
this.mHandlers[name] = func;
}
else
{
handler += func;
}
}
public void Attach(string name, object invokee, string method)
{
try
{
MethodInfo methodInfo = invokee.GetType().GetMethod(method);
Handler func = System.Delegate.CreateDelegate(typeof(Handler), invokee, methodInfo, true) as Handler;
this.Attach(name, func);
}
catch (System.Exception e)
{
throw e;
}
}
public void Detach(string funcName)
{
if (this.mHandlers.ContainsKey(funcName))
{
this.mHandlers.Remove(funcName);
}
}
public void Clear()
{
this.mHandlers.Clear();
}
public object Invoke(string name, object context, object param)
{
Handler handler = null;
this.mHandlers.TryGetValue(name, out handler);
if (handler != null)
{
return handler(context, param);
}
return null;
}
}
}