Mercurial > pub > bltoolkit
comparison Source/Common/Convert.tt @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:f990fcb411a9 |
---|---|
1 <#@ template language="C#v3.5" debug="True" #> | |
2 <#@ output extension="generated.cs" #> | |
3 <#@ assembly name="System.Core" #> | |
4 <#@ import namespace="System.Collections.Generic" #> | |
5 <#@ import namespace="System.Linq" #> | |
6 //--------------------------------------------------------------------------------------------------- | |
7 // <auto-generated> | |
8 // This code was generated by BLToolkit template for T4. | |
9 // Changes to this file may cause incorrect behavior and will be lost if the code is regenerated. | |
10 // </auto-generated> | |
11 //--------------------------------------------------------------------------------------------------- | |
12 using System; | |
13 using System.Data.Linq; | |
14 using System.Data.SqlTypes; | |
15 using System.Globalization; | |
16 using System.IO; | |
17 using System.Xml; | |
18 #if !SILVERLIGHT | |
19 using System.Xml.Linq; | |
20 #endif | |
21 | |
22 namespace BLToolkit.Common | |
23 { | |
24 using Properties; | |
25 | |
26 public partial class Convert | |
27 { | |
28 <# | |
29 GenerationEnvironment.Remove(GenerationEnvironment.Length - 2, 2); | |
30 | |
31 _types = | |
32 Set(_ => { _.Group = "Simple"; _.Method = "To" + _.Name; }, new[] | |
33 { | |
34 new ToType { Name = "Boolean", NullValue = "Configuration.NullableValues.Boolean", Froms = { { "Char", null } } }, | |
35 new ToType { Name = "Byte", NullValue = "Configuration.NullableValues.Byte" }, | |
36 new ToType { Name = "Char", NullValue = "Configuration.NullableValues.Char" }, | |
37 new ToType { Name = "DateTime", NullValue = "Configuration.NullableValues.DateTime" }, | |
38 new ToType { Name = "DateTimeOffset", NullValue = "DateTimeOffset.MinValue" }, | |
39 new ToType { Name = "Decimal", NullValue = "Configuration.NullableValues.Decimal", Froms = { { "Byte[]", null }, { "Binary", null } } }, | |
40 new ToType { Name = "Double", NullValue = "Configuration.NullableValues.Double" }, | |
41 new ToType { Name = "Guid", NullValue = "Configuration.NullableValues.Guid" }, | |
42 new ToType { Name = "Int16", NullValue = "Configuration.NullableValues.Int16" }, | |
43 new ToType { Name = "Int32", NullValue = "Configuration.NullableValues.Int32" }, | |
44 new ToType { Name = "Int64", NullValue = "Configuration.NullableValues.Int64" }, | |
45 new ToType { Name = "Single", NullValue = "Configuration.NullableValues.Single" }, | |
46 new ToType { Name = "String", NullValue = "Configuration.NullableValues.String", FromObjectReturn = "return p.ToString();" }, | |
47 new ToType { Name = "TimeSpan", NullValue = "Configuration.NullableValues.TimeSpan" }, | |
48 }.Concat(Set(_ => _.NonCompliant = true, new[] | |
49 { | |
50 new ToType { Name = "SByte", NullValue = "Configuration.NullableValues.SByte" }, | |
51 new ToType { Name = "UInt16", NullValue = "Configuration.NullableValues.UInt16" }, | |
52 new ToType { Name = "UInt32", NullValue = "Configuration.NullableValues.UInt32" }, | |
53 new ToType { Name = "UInt64", NullValue = "Configuration.NullableValues.UInt64" }, | |
54 }))) | |
55 .Concat(Set(_ => { _.Group = "Nullable"; _.Method = "ToNullable" + _.Name; _.Name += "?"; }, new[] | |
56 { | |
57 new ToType { Name = "Boolean" }, | |
58 new ToType { Name = "Byte" }, | |
59 new ToType { Name = "Char" }, | |
60 new ToType { Name = "DateTime" }, | |
61 new ToType { Name = "DateTimeOffset" }, | |
62 new ToType { Name = "Decimal" }, | |
63 new ToType { Name = "Double" }, | |
64 new ToType { Name = "Guid" }, | |
65 new ToType { Name = "Int16" }, | |
66 new ToType { Name = "Int32" }, | |
67 new ToType { Name = "Int64" }, | |
68 new ToType { Name = "Single" }, | |
69 new ToType { Name = "TimeSpan" }, | |
70 }.Concat(Set(_ => _.NonCompliant = true, new[] | |
71 { | |
72 new ToType { Name = "SByte" }, | |
73 new ToType { Name = "UInt16" }, | |
74 new ToType { Name = "UInt32" }, | |
75 new ToType { Name = "UInt64" }, | |
76 })))) | |
77 .Concat(Set(_ => { _.Group = "Sql"; _.Method = "To" + _.Name; _.NonSilverlightable = true; _.NullValue = _.Name + ".Null"; }, new[] | |
78 { | |
79 new ToType { Name = "SqlString" }, | |
80 new ToType { Name = "SqlByte" }, | |
81 new ToType { Name = "SqlInt16" }, | |
82 new ToType { Name = "SqlInt32" }, | |
83 new ToType { Name = "SqlInt64" }, | |
84 new ToType { Name = "SqlSingle" }, | |
85 new ToType { Name = "SqlDouble" }, | |
86 new ToType { Name = "SqlBoolean" }, | |
87 new ToType { Name = "SqlDecimal" }, | |
88 new ToType { Name = "SqlMoney" }, | |
89 new ToType { Name = "SqlDateTime" }, | |
90 new ToType { Name = "SqlGuid" }, | |
91 new ToType { Name = "SqlBinary" }, | |
92 new ToType { Name = "SqlBytes" }, | |
93 new ToType { Name = "SqlChars" }, | |
94 new ToType { Name = "SqlXml" }, | |
95 })) | |
96 .Concat(Set(_ => { _.Group = "Other"; }, new[] | |
97 { | |
98 new ToType { Name = "Type", Method = "ToType", NonSLMethods = { "Guid", "Guid?", "Binary", "Byte[]" } }, | |
99 new ToType { Name = "Stream", Method = "ToStream", NullValue = "Stream.Null" }, | |
100 new ToType { Name = "Byte[]", Method = "ToByteArray", NonSLMethods = { "DateTime", "DateTime?", "DateTimeOffset", "DateTimeOffset?" }, Froms = { { "Decimal", null }, { "Stream", null }, { "Char[]", null } } }, | |
101 new ToType { Name = "Char[]", Method = "ToCharArray", }, | |
102 new ToType { Name = "Binary", Method = "ToLinqBinary", }, | |
103 new ToType { Name = "XmlReader", Method = "ToXmlReader", NonSilverlightable = true }, | |
104 new ToType { Name = "XmlDocument", Method = "ToXmlDocument", NonSilverlightable = true }, | |
105 new ToType { Name = "XElement", Method = "ToXElement", NonSilverlightable = true }, | |
106 })) | |
107 .ToDictionary(_ => _.Name); | |
108 | |
109 | |
110 // To Boolean | |
111 // | |
112 ConvertFrom("String", "p == null? {2} : p.Length == 1 ? ToBoolean(p[0]) : Boolean.Parse(p)", "Boolean", "Boolean?", "SqlBoolean"); | |
113 ConvertFrom("Byte[]", "p == null || p.Length == 0 ? {2} : BitConverter.ToBoolean(p, 0)", "Boolean", "Boolean?", "SqlBoolean"); | |
114 ConvertFrom("Binary", "p == null || p.Length == 0 ? {2} : BitConverter.ToBoolean(p.ToArray(), 0)", "Boolean", "Boolean?", "SqlBoolean"); | |
115 | |
116 ConvertTo ("Boolean", "p.HasValue && p.Value", "Boolean?"); | |
117 ConvertToNull("Boolean", "p != 0", "p.HasValue && p.Value != 0", "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal"); | |
118 ConvertTo ("Boolean", "p.HasValue && ToBoolean(p.Value)", "Char?"); | |
119 ConvertTo ("Boolean", "!p.IsNull && p.Value", "SqlBoolean"); | |
120 ConvertTo ("Boolean", "!p.IsNull && ToBoolean(p.Value)", Sql("String", "Byte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money")); | |
121 | |
122 ConvertFrom("Boolean", "p", "Boolean?", "SqlBoolean"); | |
123 ConvertFrom("Char", "ToBoolean(p)", "Boolean?", "SqlBoolean"); | |
124 ConvertFrom("Char?", "p.HasValue && ToBoolean(p.Value)", "Boolean?", "SqlBoolean"); | |
125 | |
126 // To Boolean? | |
127 // | |
128 ConvertToNull("Boolean?", "p != 0", "p.HasValue ? p.Value != 0 : {2}", "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal"); | |
129 ConvertTo ("Boolean?", "p.IsNull ? {2} : p.Value", "SqlBoolean"); | |
130 ConvertTo ("Boolean?", "p.IsNull ? {2} : ToBoolean(p.Value)", Sql("String", "Byte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money")); | |
131 | |
132 // SqlBoolean | |
133 // | |
134 ConvertTo ("SqlBoolean", "p.HasValue ? p.Value : {2}", "Boolean?"); | |
135 ConvertToNull("SqlBoolean", "p != 0", "p.HasValue ? p.Value != 0 : {2}", "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal"); | |
136 ConvertTo ("SqlBoolean", "p.IsNull ? {2} : ToBoolean(p.Value)", Sql("String", "Byte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money")); | |
137 | |
138 // To Byte | |
139 // | |
140 ConvertNumber("Byte", | |
141 new string[] { "Byte" }, | |
142 new string[] { "SByte", "Int16", "Int32", "Int64", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal", "Char" }, | |
143 new string[] { "Byte" }, | |
144 new string[] { "String", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" }); | |
145 | |
146 ConvertFrom("Byte[]", "p == null || p.Length == 0 ? {2} : p[0]", "Byte", "Byte?", "SqlByte"); | |
147 ConvertFrom("Binary", "p == null || p.Length == 0 ? {2} : p.ToArray()[0]", "Byte", "Byte?", "SqlByte"); | |
148 | |
149 // To Char | |
150 // | |
151 ConvertNumber("Char", | |
152 new string[] { "Char" }, | |
153 new string[] { "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal" }, | |
154 new string[] { }, | |
155 new string[] { "String", "Byte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" }); | |
156 | |
157 ConvertFrom("String", "string.IsNullOrEmpty(p)? ({0})0 : p[0]", "Char", "Char?"); | |
158 | |
159 // To DateTime | |
160 // | |
161 ConvertTo(new[] { "DateTime", "SqlDateTime" }, "p.HasValue ? p.Value : {2}", "DateTime?"); | |
162 ConvertTo(new[] { "DateTime?", "SqlDateTime" }, "p", "DateTime"); | |
163 ConvertTo(new[] { "DateTime", "DateTime?" }, "p.IsNull ? {2} : p.Value", "SqlDateTime"); | |
164 | |
165 ConvertFrom("String", "p == null ? {2} : {3}.Parse(p, null, DateTimeStyles.NoCurrentDateDefault)", "DateTime", "DateTime?", "SqlDateTime"); | |
166 ConvertFrom("TimeSpan", "{3}.MinValue + p", "DateTime", "DateTime?", "SqlDateTime"); | |
167 ConvertFrom("Int64", "{3}.MinValue + TimeSpan.FromTicks(p)", "DateTime", "DateTime?", "SqlDateTime"); | |
168 ConvertFrom("Double", "{3}.MinValue + TimeSpan.FromDays (p)", "DateTime", "DateTime?", "SqlDateTime"); | |
169 ConvertFrom("DateTimeOffset", "p.LocalDateTime", "DateTime", "DateTime?", "SqlDateTime"); | |
170 ConvertFrom("DateTimeOffset?", "p.HasValue ? p.Value.LocalDateTime : {2}", "DateTime", "DateTime?", "SqlDateTime"); | |
171 ConvertFrom("TimeSpan?", "p.HasValue ? {3}.MinValue + p.Value : {2}", "DateTime", "DateTime?", "SqlDateTime"); | |
172 ConvertFrom("Int64?", "p.HasValue ? {3}.MinValue + TimeSpan.FromTicks(p.Value): {2}", "DateTime", "DateTime?", "SqlDateTime"); | |
173 ConvertFrom("Double?", "p.HasValue ? {3}.MinValue + TimeSpan.FromDays (p.Value): {2}", "DateTime", "DateTime?", "SqlDateTime"); | |
174 ConvertFrom("SqlDateTime", "p.IsNull ? {2} : p.Value", "DateTime", "DateTime?", "SqlDateTime"); | |
175 ConvertFrom("SqlString", "p.IsNull ? {2} : To{3}(p.Value)", "DateTime", "DateTime?", "SqlDateTime"); | |
176 ConvertFrom("SqlInt64", "p.IsNull ? {2} : {3}.MinValue + TimeSpan.FromTicks(p.Value)", "DateTime", "DateTime?", "SqlDateTime"); | |
177 ConvertFrom("SqlDouble", "p.IsNull ? {2} : {3}.MinValue + TimeSpan.FromDays (p.Value)", "DateTime", "DateTime?", "SqlDateTime"); | |
178 ConvertFrom("Byte[]", "p == null || p.Length == 0 ? {2} : {3}.FromBinary(ToInt64(p))", "DateTime", "DateTime?", "SqlDateTime"); | |
179 ConvertFrom("Binary", "p == null || p.Length == 0 ? {2} : {3}.FromBinary(ToInt64(p.ToArray()))", "DateTime", "DateTime?", "SqlDateTime"); | |
180 | |
181 // To DateTimeOffset | |
182 // | |
183 ConvertTo("DateTimeOffset", "p.HasValue ? p.Value : {2}", "DateTimeOffset?"); | |
184 ConvertTo("DateTimeOffset?", "p", "DateTimeOffset"); | |
185 | |
186 ConvertFrom("TimeSpan", "{3}.MinValue + p", "DateTimeOffset", "DateTimeOffset?"); | |
187 ConvertFrom("Int64", "{3}.MinValue + TimeSpan.FromTicks(p)", "DateTimeOffset", "DateTimeOffset?"); | |
188 ConvertFrom("Double", "{3}.MinValue + TimeSpan.FromDays (p)", "DateTimeOffset", "DateTimeOffset?"); | |
189 ConvertFrom("DateTime", "p", "DateTimeOffset", "DateTimeOffset?"); | |
190 ConvertFrom("DateTime?", "p.HasValue ? p.Value : {2}", "DateTimeOffset", "DateTimeOffset?"); | |
191 ConvertFrom("TimeSpan?", "p.HasValue ? {3}.MinValue + p.Value : {2}", "DateTimeOffset", "DateTimeOffset?"); | |
192 ConvertFrom("Int64?", "p.HasValue ? {3}.MinValue + TimeSpan.FromTicks(p.Value): {2}", "DateTimeOffset", "DateTimeOffset?"); | |
193 ConvertFrom("Double?", "p.HasValue ? {3}.MinValue + TimeSpan.FromDays (p.Value): {2}", "DateTimeOffset", "DateTimeOffset?"); | |
194 ConvertFrom("SqlDateTime", "p.IsNull ? {2} : p.Value", "DateTimeOffset", "DateTimeOffset?"); | |
195 ConvertFrom("SqlString", "p.IsNull ? {2} : ToDateTimeOffset(p.Value)", "DateTimeOffset", "DateTimeOffset?"); | |
196 ConvertFrom("SqlInt64", "p.IsNull ? {2} : {3}.MinValue + TimeSpan.FromTicks(p.Value)", "DateTimeOffset", "DateTimeOffset?"); | |
197 ConvertFrom("SqlDouble", "p.IsNull ? {2} : {3}.MinValue + TimeSpan.FromDays (p.Value)", "DateTimeOffset", "DateTimeOffset?"); | |
198 ConvertFrom("Byte[]", "p == null || p.Length == 0 ? {2} : new {0}(ToDateTime(p))", "DateTimeOffset", "DateTimeOffset?"); | |
199 ConvertFrom("Binary", "p == null || p.Length == 0 ? {2} : new {0}(ToDateTime(p.ToArray()))", "DateTimeOffset", "DateTimeOffset?"); | |
200 | |
201 // To Decimal | |
202 // | |
203 ConvertNumber("Decimal", | |
204 new string[] { "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "Char", "UInt64", "Decimal" }, | |
205 new string[] { "Single", "Double" }, | |
206 new string[] { "Byte", "Int16", "Int32", "Int64", "Decimal", "Money" }, | |
207 new string[] { "String", "Single", "Double", "Boolean" }); | |
208 | |
209 ConvertNumber("Money", | |
210 new string[] { "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "Char", "UInt64", "Decimal" }, | |
211 new string[] { "Single", "Double" }, | |
212 new string[] { "Byte", "Int16", "Int32", "Int64", "Decimal", "Money" }, | |
213 new string[] { "String", "Single", "Double", "Boolean" }); | |
214 | |
215 ConvertTo(new[] { "Decimal?", "SqlDecimal", "SqlMoney" }, "p == null || p.Length == 0 ? {2} : ToDecimal(p)", "Byte[]", "Binary"); | |
216 | |
217 // To Double | |
218 // | |
219 ConvertTo(new[] { "Double", "Double?", "SqlDouble" }, "(p - {1}.MinValue).TotalDays", "DateTime", "DateTimeOffset"); | |
220 ConvertTo("SqlDouble", "p.IsNull? {0}.Null: ToDouble(p.Value)", "SqlDateTime"); | |
221 | |
222 ConvertNumber("Double", | |
223 new string[] { "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "Char", "UInt64", "Single", "Double" }, | |
224 new string[] { "Decimal" }, | |
225 new string[] { "Byte", "Int16", "Int32", "Int64", "Single", "Double" }, | |
226 new string[] { "String", "Decimal", "Money", "Boolean", "DateTime" }); | |
227 | |
228 ConvertTo(new[] { "Double", "Double?", "SqlDouble" }, "p.HasValue ? (p.Value - {4}.MinValue).TotalDays : {2}", "DateTime?", "DateTimeOffset?"); | |
229 | |
230 ConvertFrom("TimeSpan", "p.TotalDays", "Double", "Double?", "SqlDouble"); | |
231 ConvertFrom("TimeSpan?", "p.HasValue ? p.Value.TotalDays : {2}", "Double", "Double?", "SqlDouble"); | |
232 | |
233 // To Guid | |
234 // | |
235 ConvertTo(new[] { "Guid", "SqlGuid" }, "p.HasValue ? p.Value : {2}", "Guid?"); | |
236 ConvertTo(new[] { "Guid?", "SqlGuid" }, "p", "Guid"); | |
237 ConvertTo(new[] { "Guid", "Guid?" }, "p.IsNull ? {2} : p.Value", "SqlGuid"); | |
238 | |
239 ConvertTo(new[] { "Guid", "Guid?", "SqlGuid" }, "p == null ? {2} : new Guid(p)", "String", "Byte[]"); | |
240 | |
241 ConvertFrom("SqlGuid", "p.IsNull ? {2} : p.Value", "Guid", "Guid?", "SqlGuid"); | |
242 ConvertFrom("SqlString", "p.IsNull ? {2} : new Guid(p.Value)", "Guid", "Guid?", "SqlGuid"); | |
243 ConvertFrom("SqlBinary", "p.IsNull ? {2} : p.ToSqlGuid().Value", "Guid", "Guid?", "SqlGuid"); | |
244 ConvertFrom("Binary", "p == null ? {2} : new Guid(p.ToArray())", "Guid", "Guid?", "SqlGuid"); | |
245 ConvertFrom("Type", "p == null ? {2} : p.GUID", "Guid", "Guid?", "SqlGuid"); | |
246 | |
247 // To Int16 | |
248 // | |
249 ConvertNumber("Int16", | |
250 new string[] { "SByte", "Int16", "Byte" }, | |
251 new string[] { "Int32", "Int64", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal", "Char" }, | |
252 new string[] { "Byte", "Int16" }, | |
253 new string[] { "String", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" }); | |
254 | |
255 // To Int32 | |
256 // | |
257 ConvertNumber("Int32", | |
258 new string[] { "SByte", "Int16", "Int32", "Byte", "UInt16", "Char" }, | |
259 new string[] { "Int64", "UInt32", "UInt64", "Single", "Double", "Decimal" }, | |
260 new string[] { "Byte", "Int16", "Int32" }, | |
261 new string[] { "String", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" }); | |
262 | |
263 // To Int64 | |
264 // | |
265 ConvertTo("Int64", "(p - DateTime.MinValue).Ticks", "DateTime", "DateTimeOffset"); | |
266 ConvertTo("Int64?", "(p - DateTime.MinValue).Ticks", "DateTime", "DateTimeOffset"); | |
267 ConvertTo("SqlInt64", "(p - DateTime.MinValue).Ticks", "DateTime", "DateTimeOffset"); | |
268 ConvertTo("SqlInt64", "p.IsNull? {0}.Null: ToInt64(p.Value)", "SqlDateTime"); | |
269 | |
270 ConvertNumber("Int64", | |
271 new string[] { "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "Char" }, | |
272 new string[] { "UInt64", "Single", "Double", "Decimal" }, | |
273 new string[] { "Byte", "Int16", "Int32", "Int64" }, | |
274 new string[] { "String", "Single", "Double", "Decimal", "Money", "Boolean", "DateTime" }); | |
275 | |
276 ConvertTo("Int64", " p.HasValue ? (p.Value - DateTime.MinValue).Ticks : 0", "DateTime?", "DateTimeOffset?"); | |
277 ConvertTo("Int64?", "p.HasValue ? (p.Value - DateTime.MinValue).Ticks : 0", "DateTime?", "DateTimeOffset?"); | |
278 ConvertTo("SqlInt64", "p.HasValue ? (p.Value - DateTime.MinValue).Ticks : 0", "DateTime?", "DateTimeOffset?"); | |
279 | |
280 ConvertFrom("TimeSpan", "p.Ticks", "Int64", "Int64?", "SqlInt64"); | |
281 ConvertFrom("TimeSpan?", "p.HasValue ? p.Value.Ticks : 0", "Int64", "Int64?", "SqlInt64"); | |
282 | |
283 // To SByte | |
284 // | |
285 ConvertNumber("SByte", | |
286 new string[] { "SByte" }, | |
287 new string[] { "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal", "Char" }, | |
288 new string[] { }, | |
289 new string[] { "String", "Byte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" }); | |
290 | |
291 ConvertFrom("Byte[]", "p == null || p.Length == 0 ? {2} : checked(({0})p[0])", "SByte", "SByte?"); | |
292 ConvertFrom("Binary", "p == null || p.Length == 0 ? {2} : checked(({0})p.ToArray()[0])", "SByte", "SByte?"); | |
293 | |
294 // To Single | |
295 // | |
296 ConvertNumber("Single", | |
297 new string[] { "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "Char", "UInt64", "Single" }, | |
298 new string[] { "Double", "Decimal" }, | |
299 new string[] { "Byte", "Int16", "Int32", "Int64", "Single" }, | |
300 new string[] { "String", "Double", "Decimal", "Money", "Boolean" }); | |
301 | |
302 // To String | |
303 // | |
304 ConvertToNull(new[] { "String", "SqlString" }, | |
305 "p.To{3}()", | |
306 "p.HasValue ? p.Value.To{3}() : {2}", | |
307 "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "UInt64", | |
308 "Single", "Double", "Boolean", "Decimal", "Char", "TimeSpan", "DateTime", "DateTimeOffset", "Guid"); | |
309 | |
310 ConvertTo(new[] { "String", "SqlString" }, "p == null ? {2} : p.FullName", "Type"); | |
311 ConvertTo(new[] { "String", "SqlString" }, "p == null ? {2} : System.Text.Encoding.UTF8.GetString(p, 0, p.Length)", "Byte[]"); | |
312 ConvertTo(new[] { "String", "SqlString" }, "To{0}(p.ToArray())", "Binary"); | |
313 | |
314 ConvertTo(new[] { "String", "SqlString" }, "p.To{0}()", | |
315 Sql("String", "Byte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean", "Guid")); | |
316 | |
317 ConvertTo( "String", "p.IsNull ? {2} : p.ToSqlString().Value", "SqlChars"); | |
318 ConvertTo(new[] { "String", "SqlString" }, "p.IsNull ? {2} : p.Value", "SqlXml"); | |
319 ConvertTo(new[] { "String", "SqlString" }, "p == null ? {2} : p.InnerXml", "XmlDocument"); | |
320 ConvertTo(new[] { "String", "SqlString" }, "p == null ? {2} : p.ToString()", "XElement"); | |
321 | |
322 ConvertTo("SqlString", "p ?? {2}", "String"); | |
323 ConvertTo("SqlString", "p.To{0}()", "SqlChars"); | |
324 | |
325 // To TimeSpan | |
326 // | |
327 ConvertTo("TimeSpan", "p.HasValue ? p.Value : {2}", "TimeSpan?"); | |
328 ConvertTo("TimeSpan?", "p", "TimeSpan"); | |
329 | |
330 ConvertFrom("DateTime", "p - DateTime.MinValue", "TimeSpan", "TimeSpan?"); | |
331 ConvertFrom("DateTimeOffset", "p - DateTimeOffset.MinValue", "TimeSpan", "TimeSpan?"); | |
332 ConvertFrom("Int64", "TimeSpan.FromTicks(p)", "TimeSpan", "TimeSpan?"); | |
333 ConvertFrom("Double", "TimeSpan.FromDays (p)", "TimeSpan", "TimeSpan?"); | |
334 ConvertFrom("DateTime?", "p.HasValue ? p.Value - DateTime.MinValue : {2}", "TimeSpan", "TimeSpan?"); | |
335 ConvertFrom("DateTimeOffset?", "p.HasValue ? p.Value - DateTimeOffset.MinValue : {2}", "TimeSpan", "TimeSpan?"); | |
336 ConvertFrom("Int64?", "p.HasValue ? {3}.FromTicks(p.Value) : {2}", "TimeSpan", "TimeSpan?"); | |
337 ConvertFrom("Double?", "p.HasValue ? {3}.FromDays (p.Value) : {2}", "TimeSpan", "TimeSpan?"); | |
338 ConvertFrom("SqlString", "p.IsNull ? {2} : {3}.Parse(p.Value)", "TimeSpan", "TimeSpan?"); | |
339 ConvertFrom("SqlDateTime", "p.IsNull ? {2} : p.Value - DateTime.MinValue", "TimeSpan", "TimeSpan?"); | |
340 ConvertFrom("SqlInt64", "p.IsNull ? {2} : {3}.FromTicks(p.Value)", "TimeSpan", "TimeSpan?"); | |
341 ConvertFrom("SqlDouble", "p.IsNull ? {2} : {3}.FromDays(p.Value)", "TimeSpan", "TimeSpan?"); | |
342 ConvertFrom("Byte[]", "p == null || p.Length == 0? {2} : {3}.FromTicks(ToInt64(p))", "TimeSpan", "TimeSpan?"); | |
343 ConvertFrom("Binary", "p == null || p.Length == 0? {2} : {3}.FromTicks(ToInt64(p.ToArray()))", "TimeSpan", "TimeSpan?"); | |
344 | |
345 // To UInt16 | |
346 // | |
347 ConvertNumber("UInt16", | |
348 new string[] { "UInt16", "Byte" }, | |
349 new string[] { "SByte", "Int16", "Int32", "Int64", "UInt32", "UInt64", "Single", "Double", "Decimal", "Char" }, | |
350 new string[] { "Byte" }, | |
351 new string[] { "String", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" }); | |
352 | |
353 // To UInt32 | |
354 // | |
355 ConvertNumber("UInt32", | |
356 new string[] { "Byte", "UInt16", "UInt32" }, | |
357 new string[] { "SByte", "Int16", "Int32", "Int64", "UInt64", "Single", "Double", "Decimal", "Char" }, | |
358 new string[] { "Byte" }, | |
359 new string[] { "String", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" }); | |
360 | |
361 // To UInt64 | |
362 // | |
363 ConvertNumber("UInt64", | |
364 new string[] { "Byte", "UInt16", "UInt32", "UInt64" }, | |
365 new string[] { "SByte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Char" }, | |
366 new string[] { "Byte" }, | |
367 new string[] { "String", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" }); | |
368 | |
369 // To SqlBinary | |
370 // | |
371 ConvertTo("SqlBinary", "p", "Byte[]"); | |
372 ConvertTo("SqlBinary", "p == null ? {2} : p.ToArray()", "Binary"); | |
373 ConvertTo("SqlBinary", "p == Guid.Empty? {2} : new SqlGuid(p).To{0}()", "Guid"); | |
374 ConvertTo("SqlBinary", "p.HasValue ? new SqlGuid(p.Value).ToSqlBinary(): {2}", "Guid?"); | |
375 ConvertTo("SqlBinary", "p.To{0}()", "SqlBytes" , "SqlGuid"); | |
376 | |
377 // To SqlXml | |
378 // | |
379 ConvertTo("SqlXml", "p == null ? {2} : new {0}(new XmlTextReader(new StringReader(p)))", "String"); | |
380 ConvertTo("SqlXml", "p == null ? {2} : new {0}(p)", "Stream", "XmlReader"); | |
381 ConvertTo("SqlXml", "p == null ? {2} : new {0}(new XmlTextReader(new StringReader(p.InnerXml)))", "XmlDocument"); | |
382 ConvertTo("SqlXml", "p == null ? {2} : new {0}(new XmlTextReader(new StringReader(p.ToString())))", "XElement"); | |
383 ConvertTo("SqlXml", "p == null ? {2} : new {0}(new XmlTextReader(new StringReader(new string(p))))", "Char[]"); | |
384 ConvertTo("SqlXml", "p == null ? {2} : new {0}(new MemoryStream(p))", "Byte[]"); | |
385 ConvertTo("SqlXml", "p == null ? {2} : new {0}(new MemoryStream(p.ToArray()))", "Binary"); | |
386 ConvertTo("SqlXml", "p.IsNull ? {2} : new {0}(new XmlTextReader(new StringReader(p.Value)))", "SqlString"); | |
387 ConvertTo("SqlXml", "p.IsNull ? {2} : new {0}(new XmlTextReader(new StringReader(p.ToSqlString().Value)))", "SqlChars"); | |
388 ConvertTo("SqlXml", "p.IsNull ? {2} : new {0}(new MemoryStream(p.Value))", "SqlBinary"); | |
389 ConvertTo("SqlXml", "p.IsNull ? {2} : new {0}(p.Stream)", "SqlBytes"); | |
390 | |
391 // To Stream | |
392 // | |
393 ConvertTo("Stream", "p == Guid.Empty ? {2} : new MemoryStream(p.ToByteArray())", "Guid"); | |
394 ConvertTo("Stream", "p == null ? {2} : new MemoryStream(p)", "Byte[]"); | |
395 ConvertTo("Stream", "p == null ? {2} : new MemoryStream(p.ToArray())", "Binary"); | |
396 ConvertTo("Stream", "p.HasValue ? new MemoryStream(p.Value.ToByteArray()) : {2}", "Guid?"); | |
397 ConvertTo("Stream", "p.IsNull ? {2} : p.Stream", "SqlBytes"); | |
398 ConvertTo("Stream", "p.IsNull ? {2} : new MemoryStream(p.Value)", "SqlBinary"); | |
399 ConvertTo("Stream", "p.IsNull ? {2} : new MemoryStream(p.Value.ToByteArray())", "SqlGuid"); | |
400 | |
401 // To Type | |
402 // | |
403 ConvertTo("Type", "p == null ? {2} : Type.GetType(p)", "String"); | |
404 ConvertTo("Type", "p == null ? {2} : Type.GetType(new string(p))", "Char[]"); | |
405 ConvertTo("Type", "p == null ? {2} : Type.GetTypeFromCLSID(ToGuid(p))", "Byte[]"); | |
406 ConvertTo("Type", "p == null ? {2} : Type.GetTypeFromCLSID(ToGuid(p.ToArray()))", "Binary"); | |
407 ConvertTo("Type", "p == Guid.Empty ? {2} : Type.GetTypeFromCLSID(p)", "Guid"); | |
408 ConvertTo("Type", "p.HasValue ? Type.GetTypeFromCLSID(p.Value) : {2}", "Guid?"); | |
409 ConvertTo("Type", "p.IsNull ? {2} : Type.GetType(p.Value)", "SqlString"); | |
410 ConvertTo("Type", "p.IsNull ? {2} : Type.GetType(new string(p.Value))", "SqlChars"); | |
411 ConvertTo("Type", "p.IsNull ? {2} : Type.GetTypeFromCLSID(p.Value)", "SqlGuid"); | |
412 | |
413 // To Byte[] | |
414 // | |
415 ConvertTo("Byte[]", "p == null ? {2} : System.Text.Encoding.UTF8.GetBytes(p)", "String"); | |
416 ConvertTo("Byte[]", "new[] {{ p }}", "Byte"); | |
417 ConvertTo("Byte[]", "new[] {{ checked((Byte)p) }}", "SByte"); | |
418 ConvertTo("Byte[]", "ToByteArray(p.ToBinary())", "DateTime"); | |
419 ConvertTo("Byte[]", "ToByteArray(p.LocalDateTime.ToBinary())", "DateTimeOffset"); | |
420 ConvertTo("Byte[]", "p == null ? {2} : p.ToArray()", "Binary"); | |
421 ConvertTo("Byte[]", "ToByteArray(p.Ticks)", "TimeSpan"); | |
422 ConvertTo("Byte[]", "p == Guid.Empty ? {2} : p.ToByteArray()", "Guid"); | |
423 | |
424 ConvertTo("Byte[]", "BitConverter.GetBytes(p)", | |
425 "Int16", "Int32", "Int64", "UInt16", "UInt32", "UInt64", "Single", "Double", "Boolean", "Char"); | |
426 ConvertTo("Byte[]", "p.HasValue ? ToByteArray(p.Value) : {2}", | |
427 "SByte?", "Int16?", "Int32?", "Int64?", "Byte?", "UInt16?", "UInt32?", "UInt64?", "Single?", "Double?", "Boolean?", "Decimal?", "Char?", "DateTime?", "DateTimeOffset?", "TimeSpan?", "Guid?"); | |
428 | |
429 ConvertTo("Byte[]", "p.IsNull ? {2} : p.Value", "SqlBinary", "SqlBytes"); | |
430 ConvertTo("Byte[]", "p.IsNull ? {2} : p.ToByteArray()", "SqlGuid"); | |
431 ConvertTo("Byte[]", "p.IsNull ? {2} : ToByteArray(p.Value)", | |
432 "SqlString", "SqlByte", "SqlInt16", "SqlInt32", "SqlInt64", "SqlSingle", "SqlDouble", "SqlDecimal", "SqlMoney", "SqlBoolean"); | |
433 | |
434 // To SqlBytes | |
435 // | |
436 ConvertTo("SqlBytes", "p == null ? {2} : new {0}(p)", "Byte[]", "Stream"); | |
437 ConvertTo("SqlBytes", "p == null ? {2} : new {0}(p.ToArray())", "Binary"); | |
438 ConvertTo("SqlBytes", "p == Guid.Empty ? {2}: new {0}(p.ToByteArray())", "Guid"); | |
439 ConvertTo("SqlBytes", "p.HasValue ? new {0}(p.Value.ToByteArray()) : {2}", "Guid?"); | |
440 ConvertTo("SqlBytes", "p.IsNull ? {2} : new {0}(p)", "SqlBinary"); | |
441 ConvertTo("SqlBytes", "p.IsNull ? {2} : new {0}(p.ToByteArray())", "SqlGuid"); | |
442 | |
443 ConvertTo("SqlBytes", "p == null ? {2} : new {0}(ToByteArray(p))", "String"); | |
444 | |
445 ConvertTo("SqlBytes", "new {0}(ToByteArray(p))", | |
446 "Byte", "SByte", "DateTime", "DateTimeOffset", "TimeSpan", "Int16", "Int32", "Int64", "UInt16", "UInt32", "UInt64", "Single", "Double", "Boolean", "Char"); | |
447 ConvertTo("SqlBytes", "p.HasValue ? ToSqlBytes(p.Value) : {2}", | |
448 "SByte?", "Int16?", "Int32?", "Int64?", "Byte?", "UInt16?", "UInt32?", "UInt64?", "Single?", "Double?", "Boolean?", "Decimal?", "Char?", "DateTime?", "DateTimeOffset?", "TimeSpan?", "Guid?"); | |
449 | |
450 ConvertTo("Byte[]", "p.IsNull ? {2} : ToSqlBytes(p.Value)", | |
451 "SqlString", "SqlByte", "SqlInt16", "SqlInt32", "SqlInt64", "SqlSingle", "SqlDouble", "SqlDecimal", "SqlMoney", "SqlBoolean"); | |
452 | |
453 | |
454 | |
455 string[] numberTypes1 = new string[] { "Int16", "Int32", "Int64", "UInt16", "UInt32", "UInt64", "Char", "Single", "Double", "SqlByte", "SqlInt16", "SqlInt32", "SqlInt64", "SqlSingle", "SqlDouble", "SqlDecimal", "SqlMoney" }; | |
456 string[] numberTypes2 = Add(numberTypes1, "SByte", "Byte"); | |
457 string[] numberTypes1n = numberTypes1.Where(_ => !_.StartsWith("Sql")).Select(_ => _ + "?").ToArray(); | |
458 string[] numberTypes2n = numberTypes2.Where(_ => !_.StartsWith("Sql")).Select(_ => _ + "?").ToArray(); | |
459 | |
460 // From String | |
461 // | |
462 ConvertFrom("String", "p == null? {2} : {3}.Parse(p)", | |
463 Add(Add(numberTypes2, numberTypes2n), "Decimal", "DateTimeOffset", "TimeSpan", "Decimal?", "DateTimeOffset?", "TimeSpan?")); | |
464 | |
465 // From Boolean | |
466 // | |
467 ConvertFrom("Boolean", "p ? ({0})1 : ({0})0", Add(Add(numberTypes2, numberTypes2n), "Decimal", "Decimal?")); | |
468 | |
469 // From Boolean? | |
470 // | |
471 ConvertFrom("Boolean?", "p.HasValue && p.Value ? ({0})1: ({0})0", Add(Add(numberTypes2, numberTypes2n), "Decimal", "Decimal?")); | |
472 | |
473 // From Byte[] | |
474 // | |
475 ConvertFrom("Byte[]", "p == null || p.Length == 0 ? {2} : BitConverter.To{3}(p, 0)", Add(numberTypes1, numberTypes1n)); | |
476 | |
477 // From Binary | |
478 // | |
479 ConvertFrom("Binary", "p == null || p.Length == 0 ? {2} : BitConverter.To{3}(p.ToArray(), 0)", Add(numberTypes1, numberTypes1n)); | |
480 | |
481 Generate(); | |
482 #> | |
483 } | |
484 } | |
485 <#+ | |
486 class ToType | |
487 { | |
488 public string Group; | |
489 public string Name; | |
490 public string Method; | |
491 public bool NonCompliant; | |
492 public bool NonSilverlightable; // :) | |
493 public string NullValue; | |
494 public string FromObjectReturn; | |
495 | |
496 public Dictionary<string,string> Froms = new Dictionary<string,string>(); | |
497 public HashSet<string> NonSLMethods = new HashSet<string>(); | |
498 } | |
499 | |
500 Dictionary<string,ToType> _types; | |
501 | |
502 void ConvertTo(string toType, string convertText, params string[] fromTypes) | |
503 { | |
504 foreach (string fromType in fromTypes) | |
505 { | |
506 if (toType == fromType) | |
507 continue; | |
508 | |
509 if (!_types.ContainsKey(fromType)) | |
510 throw new InvalidOperationException(fromType); | |
511 | |
512 if (!_types[toType].Froms.ContainsKey(fromType)) | |
513 _types[toType].Froms.Add(fromType, string.Format( | |
514 convertText, | |
515 toType, | |
516 fromType, | |
517 _types[toType].NullValue ?? "(" + toType + ")null", | |
518 toType. TrimEnd('?').Replace("Sql", "").Replace("Money", "Decimal"), | |
519 fromType.TrimEnd('?').Replace("Sql", "").Replace("Money", "Decimal"))); | |
520 } | |
521 } | |
522 | |
523 void ConvertTo(string[] toTypes, string convertText, params string[] fromTypes) | |
524 { | |
525 foreach (var t in toTypes) | |
526 ConvertTo(t, convertText, fromTypes); | |
527 } | |
528 | |
529 void ConvertFrom(string fromType, string convertText, params string[] toTypes) | |
530 { | |
531 foreach (string toType in toTypes) | |
532 ConvertTo(toType, convertText, fromType); | |
533 } | |
534 | |
535 void ConvertToNull(string toType, string convertText, string convertTextNull, params string[] fromTypes) | |
536 { | |
537 ConvertTo(toType, convertText, fromTypes); | |
538 ConvertTo(toType, convertTextNull, fromTypes.Select(_ => _ + "?").ToArray()); | |
539 } | |
540 | |
541 void ConvertToNull(string[] toTypes, string convertText, string convertTextNull, params string[] fromTypes) | |
542 { | |
543 foreach (var t in toTypes) | |
544 ConvertToNull(t, convertText, convertTextNull, fromTypes); | |
545 } | |
546 | |
547 void ConvertNumber(string toType, string[] types1, string[] types2, string[] types3, string[] types4) | |
548 { | |
549 if (toType != "Money") | |
550 { | |
551 ConvertToNull(toType, | |
552 "p", | |
553 "p.HasValue ? p.Value : {2}", | |
554 types1); | |
555 ConvertToNull(toType, | |
556 "checked(({0})p)", | |
557 "p.HasValue ? checked(({0})p.Value) : {2}", | |
558 types2); | |
559 ConvertTo(toType, "p.IsNull ? {2} : p.Value", Sql(types3)); | |
560 ConvertTo(toType, "p.IsNull ? {2} : To{0}(p.Value)", Sql(types4)); | |
561 | |
562 ConvertToNull(toType + "?", | |
563 "p", | |
564 "p.HasValue ? p.Value : {2}", | |
565 types1); | |
566 ConvertToNull(toType + "?", | |
567 "checked(({0})p)", | |
568 "p.HasValue ? checked(({0})p.Value) : {2}", | |
569 types2); | |
570 ConvertTo(toType + "?", "p.IsNull ? {2} : p.Value", Sql(types3)); | |
571 ConvertTo(toType + "?", "p.IsNull ? {2} : To{3}(p.Value)", Sql(types4)); | |
572 } | |
573 | |
574 if (_types.ContainsKey("Sql" + toType)) | |
575 { | |
576 ConvertToNull("Sql" + toType, | |
577 "p", | |
578 "p.HasValue ? p.Value : {2}", | |
579 types1); | |
580 ConvertToNull("Sql" + toType, | |
581 "checked(({3})p)", | |
582 "p.HasValue ? checked(({3})p.Value) : {2}", | |
583 types2); | |
584 ConvertTo("Sql" + toType, "p.To{0}()", Sql(types3)); | |
585 ConvertTo("Sql" + toType, "p.To{0}()", Sql(types4)); | |
586 } | |
587 } | |
588 | |
589 string[] Sql(params string[] types) | |
590 { | |
591 return types.Select(_ => "Sql" + _).ToArray(); | |
592 } | |
593 | |
594 string[] Add(string[] str1, params string[] str2) | |
595 { | |
596 return str1.Concat(str2).ToArray(); | |
597 } | |
598 | |
599 IEnumerable<ToType> Set(Action<ToType> action, IEnumerable<ToType> types) | |
600 { | |
601 foreach (var t in types) | |
602 { | |
603 action(t); | |
604 yield return t; | |
605 } | |
606 } | |
607 | |
608 string LenDiff(int max, string str) | |
609 { | |
610 var s = ""; | |
611 | |
612 while (max-- > str.Length) | |
613 s += " "; | |
614 | |
615 return s; | |
616 } | |
617 | |
618 Dictionary<string,int> _groupOrder = new Dictionary<string,int> | |
619 { | |
620 { "Simple", 1 }, | |
621 { "Nullable", 2 }, | |
622 { "Sql", 3 }, | |
623 { "Other", 4 }, | |
624 }; | |
625 | |
626 HashSet<string> _codedTypes = new HashSet<string> | |
627 { | |
628 "Boolean", "Char", "SByte", "Byte", "Int16", "UInt16", "Int32", "UInt32", "Int64", "UInt64", "Single", "Double", "Decimal", "DateTime", "String", | |
629 }; | |
630 | |
631 void Generate() | |
632 { | |
633 PushIndent("\t\t"); | |
634 | |
635 foreach (var gr in _types.Values.Select(_ => _.Group).Distinct()) | |
636 { | |
637 WriteLine(""); | |
638 WriteLine("#region {0} Types", gr); | |
639 | |
640 foreach (var to in | |
641 from t in _types.Values | |
642 where t.Group == gr | |
643 orderby t.Name | |
644 select t) | |
645 { | |
646 WriteLine(""); | |
647 WriteLine("#region {0}", to.Name); | |
648 | |
649 var froms = from f in to.Froms.Keys select f; | |
650 | |
651 if (to.NonSilverlightable) | |
652 { | |
653 ClearIndent(); | |
654 WriteLine(""); | |
655 WriteLine("#if !SILVERLIGHT"); | |
656 PushIndent("\t\t"); | |
657 | |
658 froms = | |
659 from f in froms | |
660 orderby _groupOrder[_types[f].Group], _types[f].Name | |
661 select f; | |
662 } | |
663 else | |
664 { | |
665 froms = | |
666 from f in froms | |
667 orderby _types[f].NonSilverlightable, _groupOrder[_types[f].Group], _types[f].Name | |
668 select f; | |
669 } | |
670 | |
671 var group = ""; | |
672 var sl = false; | |
673 var len = froms.Concat(new[] { "" }).Select(_ => _.Length).Max(); | |
674 var lcode = to.Froms.Values.Concat(new[] { "" }).Select(_ => (_ ?? "").Length).Max(); | |
675 | |
676 foreach (var f in froms) | |
677 { | |
678 var code = to.Froms[f]; | |
679 | |
680 if (code == null) | |
681 continue; | |
682 | |
683 var fr = _types[f]; | |
684 | |
685 if (!to.NonSilverlightable && sl != fr.NonSilverlightable) | |
686 { | |
687 sl = fr.NonSilverlightable; | |
688 | |
689 ClearIndent(); | |
690 WriteLine(""); | |
691 WriteLine("#if !SILVERLIGHT"); | |
692 PushIndent("\t\t"); | |
693 } | |
694 | |
695 if (fr.Group != group) | |
696 { | |
697 group = fr.Group; | |
698 | |
699 WriteLine(""); | |
700 WriteLine("// {0} Types", group); | |
701 WriteLine("//"); | |
702 } | |
703 | |
704 if (to.NonSLMethods.Contains(fr.Name)) | |
705 { | |
706 ClearIndent(); | |
707 WriteLine("#if !SILVERLIGHT"); | |
708 PushIndent("\t\t"); | |
709 } | |
710 | |
711 WriteLine("/// <summary>Converts the value from <c>{0}</c> to an equivalent <c>{1}</c> value.</summary>", fr.Name, to.Name); | |
712 | |
713 if (to.NonCompliant || fr.NonCompliant) | |
714 WriteLine("[CLSCompliant(false)]"); | |
715 | |
716 WriteLine("public static {0} {1}({2}{3} p) {{ return {4};{5} }}", | |
717 to.Name, to.Method, fr.Name, LenDiff(len, fr.Name), code, LenDiff(lcode, code)); | |
718 | |
719 if (to.NonSLMethods.Contains(fr.Name)) | |
720 { | |
721 ClearIndent(); | |
722 WriteLine("#endif"); | |
723 PushIndent("\t\t"); | |
724 } | |
725 } | |
726 | |
727 if (sl) | |
728 { | |
729 ClearIndent(); | |
730 WriteLine(""); | |
731 WriteLine("#endif"); | |
732 PushIndent("\t\t"); | |
733 } | |
734 | |
735 // From Object | |
736 // | |
737 if (to.Froms.Count > 0) | |
738 { | |
739 WriteLine(""); | |
740 WriteLine("// From Object"); | |
741 WriteLine("//"); | |
742 | |
743 WriteLine("/// <summary>Converts the value from <c>Object</c> to an equivalent <c>{0}</c> value.</summary>", to.Name); | |
744 | |
745 if (to.NonCompliant) | |
746 WriteLine("[CLSCompliant(false)]"); | |
747 | |
748 WriteLine("public static {0} {1}(object p)", to.Name, to.Method); | |
749 WriteLine("{"); | |
750 | |
751 PushIndent("\t"); | |
752 | |
753 var defType = false; | |
754 | |
755 var tc = | |
756 from f in to.Froms.Keys | |
757 where _codedTypes.Contains(f) | |
758 select f; | |
759 | |
760 if (tc.Any()) | |
761 { | |
762 WriteLine("if (p == null) return {0};", to.NullValue ?? "null"); | |
763 WriteLine(""); | |
764 | |
765 if (!_codedTypes.Contains(to.Name)) | |
766 { | |
767 WriteLine("if (p is {0}) return ({0})p;", to.Name); | |
768 WriteLine(""); | |
769 } | |
770 | |
771 defType = true; | |
772 | |
773 WriteLine("var type = p.GetType();"); | |
774 WriteLine(""); | |
775 WriteLine("// Primitive types"); | |
776 WriteLine("//"); | |
777 WriteLine("switch (Type.GetTypeCode(type))"); | |
778 WriteLine("{"); | |
779 PushIndent("\t"); | |
780 | |
781 len = new[] { to.Name, "DBNull" }.Concat(tc).Select(_ => _.Length).Max(); | |
782 | |
783 WriteLine("case TypeCode.DBNull{0} : return {1};", LenDiff(len, "DBNull"), to.NullValue ?? "null"); | |
784 | |
785 if (_codedTypes.Contains(to.Name)) | |
786 WriteLine("case TypeCode.{0}{1} : return ({0})p;", to.Name, LenDiff(len, to.Name)); | |
787 | |
788 foreach (var t in tc) | |
789 { | |
790 if (to.NonSLMethods.Contains(t)) | |
791 { | |
792 ClearIndent(); | |
793 WriteLine("#if !SILVERLIGHT"); | |
794 PushIndent("\t\t"); | |
795 PushIndent("\t"); | |
796 PushIndent("\t"); | |
797 } | |
798 | |
799 WriteLine("case TypeCode.{0}{1} : return {2}(({0}){1}p);", t, LenDiff(len, t), to.Method); | |
800 | |
801 if (to.NonSLMethods.Contains(t)) | |
802 { | |
803 ClearIndent(); | |
804 WriteLine("#endif"); | |
805 PushIndent("\t\t"); | |
806 PushIndent("\t"); | |
807 PushIndent("\t"); | |
808 } | |
809 } | |
810 | |
811 PopIndent(); | |
812 WriteLine("}"); | |
813 } | |
814 else | |
815 { | |
816 WriteLine("if (p == null || p is DBNull) return {0};", to.NullValue ?? "null"); | |
817 WriteLine(""); | |
818 WriteLine("if (p is {0}) return ({0})p;", to.Name); | |
819 } | |
820 | |
821 tc = | |
822 from f in to.Froms.Keys | |
823 where !_codedTypes.Contains(f) | |
824 select f; | |
825 | |
826 if (to.NonSilverlightable) | |
827 { | |
828 tc = | |
829 from f in tc | |
830 orderby _groupOrder[_types[f].Group], _types[f].Name | |
831 select f; | |
832 } | |
833 else | |
834 { | |
835 tc = | |
836 from f in tc | |
837 orderby _types[f].NonSilverlightable, _groupOrder[_types[f].Group], _types[f].Name | |
838 select f; | |
839 } | |
840 | |
841 var openGroupBlock = false; | |
842 | |
843 group = ""; | |
844 sl = false; | |
845 len = new[] { "" }.Concat(tc).Select(_ => _.Length).Max(); | |
846 | |
847 foreach (var f in tc) | |
848 { | |
849 var fr = _types[f]; | |
850 | |
851 if (!to.NonSilverlightable && sl != fr.NonSilverlightable) | |
852 { | |
853 sl = fr.NonSilverlightable; | |
854 | |
855 ClearIndent(); | |
856 WriteLine(""); | |
857 WriteLine("#if !SILVERLIGHT"); | |
858 PushIndent("\t\t"); | |
859 PushIndent("\t"); | |
860 } | |
861 | |
862 if (fr.Group != group) | |
863 { | |
864 group = fr.Group; | |
865 | |
866 if (openGroupBlock) | |
867 { | |
868 openGroupBlock = false; | |
869 PopIndent(); | |
870 WriteLine("}"); | |
871 } | |
872 | |
873 WriteLine(""); | |
874 WriteLine("// {0} Types", group); | |
875 WriteLine("//"); | |
876 | |
877 if (group == "Nullable") | |
878 { | |
879 openGroupBlock = true; | |
880 | |
881 if (!defType) | |
882 { | |
883 defType = true; | |
884 WriteLine("var type = p.GetType();"); | |
885 WriteLine(""); | |
886 } | |
887 | |
888 WriteLine("if (type.IsGenericType)"); | |
889 WriteLine("{"); | |
890 | |
891 PushIndent("\t"); | |
892 } | |
893 else if (group == "Sql") | |
894 { | |
895 openGroupBlock = true; | |
896 | |
897 WriteLine("if (p is INullable)"); | |
898 WriteLine("{"); | |
899 | |
900 PushIndent("\t"); | |
901 } | |
902 } | |
903 | |
904 if (to.NonSLMethods.Contains(fr.Name)) | |
905 { | |
906 ClearIndent(); | |
907 WriteLine("#if !SILVERLIGHT"); | |
908 PushIndent("\t\t"); | |
909 PushIndent("\t"); | |
910 if (openGroupBlock) | |
911 PushIndent("\t"); | |
912 } | |
913 | |
914 WriteLine("if (p is {0}){1} return {2}(({0}){1}p);", fr.Name, LenDiff(len, fr.Name), to.Method); | |
915 | |
916 if (to.NonSLMethods.Contains(fr.Name)) | |
917 { | |
918 ClearIndent(); | |
919 WriteLine("#endif"); | |
920 PushIndent("\t\t"); | |
921 PushIndent("\t"); | |
922 if (openGroupBlock) | |
923 PushIndent("\t"); | |
924 } | |
925 } | |
926 | |
927 if (openGroupBlock) | |
928 { | |
929 PopIndent(); | |
930 WriteLine("}"); | |
931 } | |
932 | |
933 if (sl) | |
934 { | |
935 ClearIndent(); | |
936 WriteLine(""); | |
937 WriteLine("#endif"); | |
938 PushIndent("\t\t"); | |
939 PushIndent("\t"); | |
940 } | |
941 | |
942 if (_codedTypes.Contains(to.Name)) | |
943 { | |
944 WriteLine(""); | |
945 WriteLine("if (p is IConvertible) return ((IConvertible)p).To{0}(null);", to.Name); | |
946 } | |
947 | |
948 WriteLine(""); | |
949 | |
950 if (to.FromObjectReturn != null) | |
951 WriteLine(to.FromObjectReturn); | |
952 else | |
953 WriteLine("throw CreateInvalidCastException(p.GetType(), typeof({0}));", to.Name); | |
954 | |
955 PopIndent(); | |
956 | |
957 WriteLine("}"); | |
958 } | |
959 | |
960 if (to.NonSilverlightable) | |
961 { | |
962 ClearIndent(); | |
963 WriteLine(""); | |
964 WriteLine("#endif"); | |
965 PushIndent("\t\t"); | |
966 } | |
967 | |
968 WriteLine(""); | |
969 WriteLine("#endregion"); | |
970 } | |
971 | |
972 WriteLine(""); | |
973 WriteLine("#endregion"); | |
974 } | |
975 | |
976 ClearIndent(); | |
977 } | |
978 #> |