internal static void Invoke(List<Delegate> list, MessageHeader message_header, List<object> parameters) { foreach (Delegate del in list) { Invoke(del, message_header, parameters); } }
internal static void Invoke(MessageHeader message_header, List<object> parameters) { BinaryTree.Node node = Message.TypeNames[message_header.MessageType]; if (node == null) { return; } Invoke(node.invokerlist, message_header, parameters); }
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); }