protected int HandleQtMetacall(int index, QMetaObject.Call call, void **arguments) { if (index < 0 || call != QMetaObject.Call.InvokeMetaMethod) { return(index); } Handler handler = this.slots[index]; System.Reflection.ParameterInfo[] @params = handler.Delegate.Method.GetParameters(); object[] parameters = new object[@params.Length]; for (int i = 0; i < @params.Length; i++) { System.Reflection.ParameterInfo parameter = @params[i]; var arg = new IntPtr(arguments[1 + i]); object value; if (parameter.ParameterType.IsValueType) { value = Marshal.PtrToStructure(arg, parameter.ParameterType); } else { if (parameter.ParameterType.IsAssignableFrom(typeof(string))) { var metaMethod = this.Sender.MetaObject.Method(handler.SignalId); if (metaMethod.ParameterType(i) == (int)QMetaType.Type.QString) { value = Marshal.PtrToStringUni(new IntPtr(new QString(arg).Utf16)); } else { value = Marshal.PtrToStringUni(arg); } } else { value = Activator.CreateInstance(parameter.ParameterType, arg); } } parameters[i] = value; } handler.Delegate.DynamicInvoke(parameters); return(-1); }
protected int HandleQtMetacall(int index, QMetaObject.Call call, void **arguments) { if (index < 0 || call != QMetaObject.Call.InvokeMetaMethod) { return(index); } Handler handler = this.slots[index]; System.Reflection.ParameterInfo[] @params = handler.Delegate.Method.GetParameters(); object[] parameters = new object[@params.Length]; for (int i = 0; i < @params.Length; i++) { System.Reflection.ParameterInfo parameter = @params[i]; var arg = new IntPtr(arguments[1 + i]); parameters[i] = GetParameterValue(handler, i, parameter, arg); } handler.Delegate.DynamicInvoke(parameters); return(-1); }