private IEnumerable <string> GenerateEvent(short methodID, System.Reflection.EventInfo eventInfo) { var privateEvent = $"_{eventInfo.Name}"; var codeLines = new List <string>(); codeLines.Add($"private event EventHandler<{eventInfo.ArgsTypeName()}> {privateEvent};"); codeLines.Add($"public event EventHandler<{eventInfo.ArgsTypeName()}> {eventInfo.Name}"); codeLines.Add("{"); codeLines.Add("add{"); codeLines.Add($"Add_{eventInfo.Name}();"); codeLines.Add($"{privateEvent} += value;"); codeLines.Add("}"); codeLines.Add("remove{"); codeLines.Add($"Remove_{eventInfo.Name}();"); codeLines.Add($"{privateEvent} -= value;"); codeLines.Add("}"); codeLines.Add("}"); codeLines.Add($"private void Add_{eventInfo.Name}()"); codeLines.Add("{"); codeLines.Add($"if ({privateEvent} != null) return;"); if (OutputDebug) { var msg = $"proxy: add_event {eventInfo.Name} id={methodID}"; codeLines.Add($"System.Console.WriteLine(\"{msg}\");"); } codeLines.Add("using var stream = new MemoryStream();"); codeLines.Add($"_proxyItem.SendCallRequest({methodID}, stream.ToArray());"); codeLines.Add("}"); codeLines.Add($"private void Remove_{eventInfo.Name}()"); codeLines.Add("{"); codeLines.Add($"if ({privateEvent} == null) return;"); if (OutputDebug) { var msg = $"proxy: remove_event {eventInfo.Name} id={methodID}"; codeLines.Add($"System.Console.WriteLine(\"{msg}\");"); } codeLines.Add("try {"); codeLines.Add("using var stream = new MemoryStream();"); codeLines.Add($"_proxyItem.SendCallRequest({methodID + 1}, stream.ToArray());"); codeLines.Add("} catch {}"); //all exceptions need be caught here codeLines.Add("}"); codeLines.Add($"private void Fire_{eventInfo.Name}(Stream dataStream)"); codeLines.Add("{"); if (OutputDebug) { var msg = $"proxy: on_event {eventInfo.Name} id={methodID}"; codeLines.Add($"System.Console.WriteLine(\"{msg}\");"); } codeLines.Add("var serializer = new Serializer(dataStream);"); var argType = eventInfo.EventHandlerType.GenericTypeArguments[0]; codeLines.Add($"var args = {SerializeStatement.DeserializeObject(argType)}"); codeLines.Add($"var handler = {privateEvent};"); codeLines.Add($"if (handler != null) handler(this, args);"); codeLines.Add("}"); return(codeLines); }