void InvokeNative(GtkBeans.Builder builder, GLib.Object objekt, string signal_name, string handler_name, GLib.Object connect_object, GLib.ConnectFlags flags) { IntPtr native_signal_name = GLib.Marshaller.StringToPtrGStrdup(signal_name); IntPtr native_handler_name = GLib.Marshaller.StringToPtrGStrdup(handler_name); native_cb(builder == null ? IntPtr.Zero : builder.Handle, objekt == null ? IntPtr.Zero : objekt.Handle, native_signal_name, native_handler_name, connect_object == null ? IntPtr.Zero : connect_object.Handle, (int)flags, __data); GLib.Marshaller.Free(native_signal_name); GLib.Marshaller.Free(native_handler_name); }
public void ConnectFunc(Builder builder, GLib.Object objekt, string signal_name, string handler_name, GLib.Object connect_object, GLib.ConnectFlags flags) { /* search for the event to connect */ System.Reflection.MemberInfo[] evnts = objekt.GetType(). FindMembers(System.Reflection.MemberTypes.Event, System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic, new System.Reflection.MemberFilter(SignalFilter), signal_name); foreach (System.Reflection.EventInfo ei in evnts) { bool connected = false; System.Reflection.MethodInfo add = ei.GetAddMethod(); System.Reflection.ParameterInfo[] addpi = add.GetParameters(); if (addpi.Length == 1) /* this should be always true, unless there's something broken */ { Type delegate_type = addpi[0].ParameterType; /* look for an instance method */ if (connect_object != null || handler != null) { try { Delegate d = Delegate.CreateDelegate(delegate_type, connect_object != null ? connect_object : handler, handler_name); add.Invoke(objekt, new object[] { d }); connected = true; } catch (ArgumentException) { /* ignore if there is not such instance method */ } } /* look for a static method if no instance method has been found */ if (!connected && handler_type != null) { try { Delegate d = Delegate.CreateDelegate(delegate_type, handler_type, handler_name); add.Invoke(objekt, new object[] { d }); connected = true; } catch (ArgumentException) { /* ignore if there is not such static method */ } } if (!connected) { string msg = ExplainError(ei.Name, delegate_type, handler_type, handler_name); throw new HandlerNotFoundException(msg, handler_name, signal_name, ei, delegate_type); } } } }