internal static void Invoke(Delegate del, MessageHeader message_header, List<object> parameters)
{
var param = del.Method.GetParameters();
object[] argumentList = new object[param.Length];
int last = 0;
for (int i = 0; i < param.Length; i++) {
Type t = param[i].ParameterType;
// handle special arguments first
if (t == typeof(MessageHeader)) {
argumentList[i] = message_header;
last++;
} else if (t == typeof(Player)) {
argumentList[i] = message_header.Player;
last++;
} else if (t.IsMessage()) {
int j = 0;
object o = Activator.CreateInstance(t);
foreach (var pi in t.GetFields()) {
if (j < parameters.Count) {
pi.SetValue(o, parameters[j]);
}
j++;
}
argumentList[i] = o;
last++;
} else {
break;
}
}
// copy the parameters in order for the rest
parameters.CopyTo(0, argumentList, last, param.Length - last);
for (int i = last + parameters.Count; i < param.Length; i++) {
argumentList[i] = param[i].DefaultValue;
}
del.Method.Invoke(null, argumentList);
}