public static object RemoveListener(object bag, object listener)
{
if (listener == null)
{
throw new ArgumentException();
}
if (listener is object[])
{
throw new ArgumentException();
}
if (bag == listener)
{
bag = null;
}
else
{
if (bag is object[])
{
object[] array = (object[])bag;
int L = array.Length;
// bag has at least 2 elements if it is array
if (L < 2)
{
throw new ArgumentException();
}
if (L == 2)
{
if (array[1] == listener)
{
bag = array[0];
}
else
{
if (array[0] == listener)
{
bag = array[1];
}
}
}
else
{
int i = L;
do
{
--i;
if (array[i] == listener)
{
object[] tmp = new object[L - 1];
System.Array.Copy(array, 0, tmp, 0, i);
System.Array.Copy(array, i + 1, tmp, i, L - (i + 1));
bag = tmp;
break;
}
}
while (i != 0);
}
}
}
return bag;
}