@@ -54,34 +54,65 @@ protected int HandleQtMetacall(int index, QMetaObject.Call call, void** argument
54
54
{
55
55
System . Reflection . ParameterInfo parameter = @params [ i ] ;
56
56
var arg = new IntPtr ( arguments [ 1 + i ] ) ;
57
- object value ;
58
- if ( parameter . ParameterType . IsValueType )
59
- {
60
- value = Marshal . PtrToStructure ( arg , parameter . ParameterType ) ;
61
- }
62
- else
63
- {
64
- if ( parameter . ParameterType . IsAssignableFrom ( typeof ( string ) ) )
65
- {
66
- var metaMethod = this . Sender . MetaObject . Method ( handler . SignalId ) ;
67
- if ( metaMethod . ParameterType ( i ) == ( int ) QMetaType . Type . QString )
68
- {
69
- value = Marshal . PtrToStringUni ( new IntPtr ( QtCore . QString . __CreateInstance ( arg ) . Utf16 ) ) ;
70
- }
71
- else
72
- {
73
- value = Marshal . PtrToStringUni ( arg ) ;
74
- }
75
- }
76
- else
77
- {
78
- value = Activator . CreateInstance ( parameter . ParameterType , arg ) ;
79
- }
80
- }
81
- parameters [ i ] = value ;
57
+ parameters [ i ] = GetParameterValue ( handler , i , parameter , arg ) ;
82
58
}
83
59
handler . Delegate . DynamicInvoke ( parameters ) ;
84
60
return - 1 ;
85
61
}
62
+
63
+ private object GetParameterValue ( Handler handler , int i , System . Reflection . ParameterInfo parameter , IntPtr arg )
64
+ {
65
+ if ( arg == IntPtr . Zero )
66
+ {
67
+ return null ;
68
+ }
69
+ var type = parameter . ParameterType . IsEnum ? parameter . ParameterType . GetEnumUnderlyingType ( ) : parameter . ParameterType ;
70
+ switch ( Type . GetTypeCode ( type ) )
71
+ {
72
+ case TypeCode . Empty :
73
+ return null ;
74
+ case TypeCode . Object :
75
+ return Activator . CreateInstance ( type , arg ) ;
76
+ case TypeCode . DBNull :
77
+ return DBNull . Value ;
78
+ case TypeCode . Boolean :
79
+ return * ( bool * ) arg ;
80
+ case TypeCode . Char :
81
+ return * ( char * ) arg ;
82
+ case TypeCode . SByte :
83
+ return * ( sbyte * ) arg ;
84
+ case TypeCode . Byte :
85
+ return * ( byte * ) arg ;
86
+ case TypeCode . Int16 :
87
+ return * ( short * ) arg ;
88
+ case TypeCode . UInt16 :
89
+ return * ( ushort * ) arg ;
90
+ case TypeCode . Int32 :
91
+ return * ( int * ) arg ;
92
+ case TypeCode . UInt32 :
93
+ return * ( uint * ) arg ;
94
+ case TypeCode . Int64 :
95
+ return * ( long * ) arg ;
96
+ case TypeCode . UInt64 :
97
+ return * ( ulong * ) arg ;
98
+ case TypeCode . Single :
99
+ return * ( float * ) arg ;
100
+ case TypeCode . Double :
101
+ return * ( double * ) arg ;
102
+ case TypeCode . Decimal :
103
+ return * ( decimal * ) arg ;
104
+ case TypeCode . DateTime :
105
+ return * ( DateTime * ) arg ;
106
+ case TypeCode . String :
107
+ var metaMethod = this . Sender . MetaObject . Method ( handler . SignalId ) ;
108
+ if ( metaMethod . ParameterType ( i ) == ( int ) QMetaType . Type . QString )
109
+ {
110
+ return Marshal . PtrToStringUni ( new IntPtr ( QtCore . QString . __CreateInstance ( arg ) . Utf16 ) ) ;
111
+ }
112
+ return Marshal . PtrToStringUni ( arg ) ;
113
+ default :
114
+ throw new ArgumentOutOfRangeException ( parameter . Name , "Parameter type with invalid type code." ) ;
115
+ }
116
+ }
86
117
}
87
118
}
0 commit comments