Esempio n. 1
0
        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);
        }