@@ -16,11 +16,11 @@ public class Orm {
1616 public Orm ( ) {
1717 AddDefaultTypeSerializers ( ) ;
1818 }
19- public void RegisterType ( Type type , SqliteType sqliteType , Func < object , SqliteValue > serialize , Func < SqliteValue , object ? > deserialize ) {
19+ public void RegisterType ( Type type , SqliteType sqliteType , Func < object , SqliteValue > serialize , Func < SqliteValue , Type , object ? > deserialize ) {
2020 TypeSerializers [ type ] = new TypeSerializer ( type , sqliteType , serialize , deserialize ) ;
2121 }
22- public void RegisterType < T > ( SqliteType sqliteType , Func < T , SqliteValue > serialize , Func < SqliteValue , object > deserialize ) {
23- RegisterType ( typeof ( T ) , sqliteType , ( object clr ) => serialize ( ( T ) clr ) , ( SqliteValue sqlite ) => deserialize ( sqlite ) ) ;
22+ public void RegisterType < T > ( SqliteType sqliteType , Func < T , SqliteValue > serialize , Func < SqliteValue , Type , object > deserialize ) {
23+ RegisterType ( typeof ( T ) , sqliteType , ( object clr ) => serialize ( ( T ) clr ) , ( SqliteValue sqlite , Type clrType ) => deserialize ( sqlite , clrType ) ) ;
2424 }
2525 public bool UnregisterType ( Type type ) {
2626 return TypeSerializers . TryRemove ( type , out _ ) ;
@@ -47,7 +47,7 @@ public TypeSerializer GetTypeSerializer(Type type) {
4747 public object ? ReadColumn ( Sqlite3Statement statement , int index , Type type ) {
4848 TypeSerializer typeSerializer = GetTypeSerializer ( type ) ;
4949 SqliteValue value = SQLiteRaw . GetColumnValue ( statement , index ) ;
50- return typeSerializer . Deserialize ( value ) ;
50+ return typeSerializer . Deserialize ( value , type ) ;
5151 }
5252 public void BindParameter ( Sqlite3Statement statement , int index , object ? value ) {
5353 if ( value is null ) {
@@ -121,107 +121,107 @@ private void AddDefaultTypeSerializers() {
121121 RegisterType < bool > (
122122 sqliteType : SqliteType . Integer ,
123123 serialize : ( bool clr ) => clr ? 1 : 0 ,
124- deserialize : ( SqliteValue sqlite ) => ( int ) sqlite . AsInteger != 0
124+ deserialize : ( SqliteValue sqlite , Type clrType ) => ( int ) sqlite . AsInteger != 0
125125 ) ;
126126 RegisterType < string > (
127127 sqliteType : SqliteType . Text ,
128128 serialize : ( string clr ) => clr ,
129- deserialize : ( SqliteValue sqlite ) => sqlite . AsText
129+ deserialize : ( SqliteValue sqlite , Type clrType ) => sqlite . AsText
130130 ) ;
131131 RegisterType < byte > (
132132 sqliteType : SqliteType . Integer ,
133133 serialize : ( byte clr ) => clr ,
134- deserialize : ( SqliteValue sqlite ) => ( byte ) sqlite . AsInteger
134+ deserialize : ( SqliteValue sqlite , Type clrType ) => ( byte ) sqlite . AsInteger
135135 ) ;
136136 RegisterType < sbyte > (
137137 sqliteType : SqliteType . Integer ,
138138 serialize : ( sbyte clr ) => clr ,
139- deserialize : ( SqliteValue sqlite ) => ( sbyte ) sqlite . AsInteger
139+ deserialize : ( SqliteValue sqlite , Type clrType ) => ( sbyte ) sqlite . AsInteger
140140 ) ;
141141 RegisterType < short > (
142142 sqliteType : SqliteType . Integer ,
143143 serialize : ( short clr ) => clr ,
144- deserialize : ( SqliteValue sqlite ) => ( short ) sqlite . AsInteger
144+ deserialize : ( SqliteValue sqlite , Type clrType ) => ( short ) sqlite . AsInteger
145145 ) ;
146146 RegisterType < ushort > (
147147 sqliteType : SqliteType . Integer ,
148148 serialize : ( ushort clr ) => clr ,
149- deserialize : ( SqliteValue sqlite ) => ( ushort ) sqlite . AsInteger
149+ deserialize : ( SqliteValue sqlite , Type clrType ) => ( ushort ) sqlite . AsInteger
150150 ) ;
151151 RegisterType < int > (
152152 sqliteType : SqliteType . Integer ,
153153 serialize : ( int clr ) => clr ,
154- deserialize : ( SqliteValue sqlite ) => ( int ) sqlite . AsInteger
154+ deserialize : ( SqliteValue sqlite , Type clrType ) => ( int ) sqlite . AsInteger
155155 ) ;
156156 RegisterType < uint > (
157157 sqliteType : SqliteType . Integer ,
158158 serialize : ( uint clr ) => clr ,
159- deserialize : ( SqliteValue sqlite ) => ( uint ) sqlite . AsInteger
159+ deserialize : ( SqliteValue sqlite , Type clrType ) => ( uint ) sqlite . AsInteger
160160 ) ;
161161 RegisterType < long > (
162162 sqliteType : SqliteType . Integer ,
163163 serialize : ( long clr ) => clr ,
164- deserialize : ( SqliteValue sqlite ) => sqlite . AsInteger
164+ deserialize : ( SqliteValue sqlite , Type clrType ) => sqlite . AsInteger
165165 ) ;
166166 RegisterType < ulong > (
167167 sqliteType : SqliteType . Integer ,
168168 serialize : ( ulong clr ) => clr ,
169- deserialize : ( SqliteValue sqlite ) => ( ulong ) sqlite . AsInteger
169+ deserialize : ( SqliteValue sqlite , Type clrType ) => ( ulong ) sqlite . AsInteger
170170 ) ;
171171 RegisterType < char > (
172172 sqliteType : SqliteType . Integer ,
173173 serialize : ( char clr ) => clr ,
174- deserialize : ( SqliteValue sqlite ) => sqlite . AsInteger
174+ deserialize : ( SqliteValue sqlite , Type clrType ) => sqlite . AsInteger
175175 ) ;
176176 RegisterType < float > (
177177 sqliteType : SqliteType . Integer ,
178178 serialize : ( float clr ) => clr ,
179- deserialize : ( SqliteValue sqlite ) => ( float ) sqlite . AsFloat
179+ deserialize : ( SqliteValue sqlite , Type clrType ) => ( float ) sqlite . AsFloat
180180 ) ;
181181 RegisterType < double > (
182182 sqliteType : SqliteType . Integer ,
183183 serialize : ( double clr ) => clr ,
184- deserialize : ( SqliteValue sqlite ) => sqlite . AsFloat
184+ deserialize : ( SqliteValue sqlite , Type clrType ) => sqlite . AsFloat
185185 ) ;
186186 RegisterType < TimeSpan > (
187187 sqliteType : SqliteType . Integer ,
188188 serialize : ( TimeSpan clr ) => clr . Ticks ,
189- deserialize : ( SqliteValue sqlite ) => new TimeSpan ( sqlite . AsInteger )
189+ deserialize : ( SqliteValue sqlite , Type clrType ) => new TimeSpan ( sqlite . AsInteger )
190190 ) ;
191191 RegisterType < DateTime > (
192192 sqliteType : SqliteType . Integer ,
193193 serialize : ( DateTime clr ) => clr . Ticks ,
194- deserialize : ( SqliteValue sqlite ) => new DateTime ( sqlite . AsInteger )
194+ deserialize : ( SqliteValue sqlite , Type clrType ) => new DateTime ( sqlite . AsInteger )
195195 ) ;
196196 RegisterType < Uri > (
197197 sqliteType : SqliteType . Text ,
198198 serialize : ( Uri clr ) => clr . AbsoluteUri ,
199- deserialize : ( SqliteValue sqlite ) => new Uri ( sqlite . AsText )
199+ deserialize : ( SqliteValue sqlite , Type clrType ) => new Uri ( sqlite . AsText )
200200 ) ;
201201 RegisterType < byte [ ] > (
202202 sqliteType : SqliteType . Blob ,
203203 serialize : ( byte [ ] clr ) => clr ,
204- deserialize : ( SqliteValue sqlite ) => sqlite . AsBlob
204+ deserialize : ( SqliteValue sqlite , Type clrType ) => sqlite . AsBlob
205205 ) ;
206206 RegisterType < IEnumerable < byte > > (
207207 sqliteType : SqliteType . Blob ,
208208 serialize : ( IEnumerable < byte > clr ) => clr . ToArray ( ) ,
209- deserialize : ( SqliteValue sqlite ) => sqlite . AsBlob . ToList ( )
209+ deserialize : ( SqliteValue sqlite , Type clrType ) => sqlite . AsBlob . ToList ( )
210210 ) ;
211211 RegisterType < Enum > (
212212 sqliteType : SqliteType . Integer ,
213213 serialize : ( Enum clr ) => Convert . ToInt64 ( clr ) ,
214- deserialize : ( SqliteValue sqlite ) => sqlite . AsInteger
214+ deserialize : ( SqliteValue sqlite , Type clrType ) => Enum . ToObject ( clrType , sqlite . AsInteger )
215215 ) ;
216216 RegisterType < StringBuilder > (
217217 sqliteType : SqliteType . Text ,
218218 serialize : ( StringBuilder clr ) => clr . ToString ( ) ,
219- deserialize : ( SqliteValue sqlite ) => sqlite . AsText
219+ deserialize : ( SqliteValue sqlite , Type clrType ) => sqlite . AsText
220220 ) ;
221221 RegisterType < Guid > (
222222 sqliteType : SqliteType . Text ,
223223 serialize : ( Guid clr ) => clr . ToString ( ) ,
224- deserialize : ( SqliteValue sqlite ) => sqlite . AsText
224+ deserialize : ( SqliteValue sqlite , Type clrType ) => sqlite . AsText
225225 ) ;
226226 }
227227 private static string GetTypeSql ( SqliteType sqliteType ) => sqliteType switch {
@@ -234,9 +234,9 @@ private void AddDefaultTypeSerializers() {
234234 } ;
235235}
236236
237- public readonly struct TypeSerializer ( Type clrType , SqliteType sqliteType , Func < object , SqliteValue > serialize , Func < SqliteValue , object ? > deserialize ) {
237+ public readonly struct TypeSerializer ( Type clrType , SqliteType sqliteType , Func < object , SqliteValue > serialize , Func < SqliteValue , Type , object ? > deserialize ) {
238238 public Type ClrType { get ; } = clrType ;
239239 public SqliteType SqliteType { get ; } = sqliteType ;
240240 public Func < object , SqliteValue > Serialize { get ; } = serialize ;
241- public Func < SqliteValue , object ? > Deserialize { get ; } = deserialize ;
241+ public Func < SqliteValue , Type , object ? > Deserialize { get ; } = deserialize ;
242242}
0 commit comments