diff Source/Common/Convert.tt @ 0:f990fcb411a9

Копия текущей версии из github
author cin
date Thu, 27 Mar 2014 21:46:09 +0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Source/Common/Convert.tt	Thu Mar 27 21:46:09 2014 +0400
@@ -0,0 +1,978 @@
+<#@ template language="C#v3.5" debug="True"       #>
+<#@ output extension="generated.cs"               #>
+<#@ assembly name="System.Core"                   #>
+<#@ import namespace="System.Collections.Generic" #>
+<#@ import namespace="System.Linq" #>
+//---------------------------------------------------------------------------------------------------
+// <auto-generated>
+//    This code was generated by BLToolkit template for T4.
+//    Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
+// </auto-generated>
+//---------------------------------------------------------------------------------------------------
+using System;
+using System.Data.Linq;
+using System.Data.SqlTypes;
+using System.Globalization;
+using System.IO;
+using System.Xml;
+#if !SILVERLIGHT
+using System.Xml.Linq;
+#endif
+
+namespace BLToolkit.Common
+{
+	using Properties;
+
+	public partial class Convert
+	{ 
+<#
+		GenerationEnvironment.Remove(GenerationEnvironment.Length - 2, 2);
+
+		_types =
+			Set(_ => { _.Group = "Simple"; _.Method = "To" + _.Name; }, new[]
+				{
+					new ToType { Name = "Boolean",        NullValue = "Configuration.NullableValues.Boolean", Froms = { { "Char", null } } },
+					new ToType { Name = "Byte",           NullValue = "Configuration.NullableValues.Byte"     },
+					new ToType { Name = "Char",           NullValue = "Configuration.NullableValues.Char"     },
+					new ToType { Name = "DateTime",       NullValue = "Configuration.NullableValues.DateTime" },
+					new ToType { Name = "DateTimeOffset", NullValue = "DateTimeOffset.MinValue"               },
+					new ToType { Name = "Decimal",        NullValue = "Configuration.NullableValues.Decimal", Froms = { { "Byte[]", null }, { "Binary", null } } },
+					new ToType { Name = "Double",         NullValue = "Configuration.NullableValues.Double"   },
+					new ToType { Name = "Guid",           NullValue = "Configuration.NullableValues.Guid"     },
+					new ToType { Name = "Int16",          NullValue = "Configuration.NullableValues.Int16"    },
+					new ToType { Name = "Int32",          NullValue = "Configuration.NullableValues.Int32"    },
+					new ToType { Name = "Int64",          NullValue = "Configuration.NullableValues.Int64"    },
+					new ToType { Name = "Single",         NullValue = "Configuration.NullableValues.Single"   },
+					new ToType { Name = "String",         NullValue = "Configuration.NullableValues.String",  FromObjectReturn = "return p.ToString();" },
+					new ToType { Name = "TimeSpan",       NullValue = "Configuration.NullableValues.TimeSpan" },
+				}.Concat(Set(_ => _.NonCompliant = true, new[]
+				{
+					new ToType { Name = "SByte",          NullValue = "Configuration.NullableValues.SByte"    },
+					new ToType { Name = "UInt16",         NullValue = "Configuration.NullableValues.UInt16"   },
+					new ToType { Name = "UInt32",         NullValue = "Configuration.NullableValues.UInt32"   },
+					new ToType { Name = "UInt64",         NullValue = "Configuration.NullableValues.UInt64"   },
+				})))
+			.Concat(Set(_ => { _.Group = "Nullable"; _.Method = "ToNullable" + _.Name; _.Name += "?"; }, new[]
+				{
+					new ToType { Name = "Boolean"        },
+					new ToType { Name = "Byte"           },
+					new ToType { Name = "Char"           },
+					new ToType { Name = "DateTime"       },
+					new ToType { Name = "DateTimeOffset" },
+					new ToType { Name = "Decimal"        },
+					new ToType { Name = "Double"         },
+					new ToType { Name = "Guid"           },
+					new ToType { Name = "Int16"          },
+					new ToType { Name = "Int32"          },
+					new ToType { Name = "Int64"          },
+					new ToType { Name = "Single"         },
+					new ToType { Name = "TimeSpan"       },
+				}.Concat(Set(_ => _.NonCompliant = true, new[]
+				{
+					new ToType { Name = "SByte"  },
+					new ToType { Name = "UInt16" },
+					new ToType { Name = "UInt32" },
+					new ToType { Name = "UInt64" },
+				}))))
+			.Concat(Set(_ => { _.Group = "Sql"; _.Method = "To" + _.Name; _.NonSilverlightable = true; _.NullValue = _.Name + ".Null"; }, new[]
+				{
+					new ToType { Name = "SqlString"   },
+					new ToType { Name = "SqlByte"     },
+					new ToType { Name = "SqlInt16"    },
+					new ToType { Name = "SqlInt32"    },
+					new ToType { Name = "SqlInt64"    },
+					new ToType { Name = "SqlSingle"   },
+					new ToType { Name = "SqlDouble"   },
+					new ToType { Name = "SqlBoolean"  },
+					new ToType { Name = "SqlDecimal"  },
+					new ToType { Name = "SqlMoney"    },
+					new ToType { Name = "SqlDateTime" },
+					new ToType { Name = "SqlGuid"     },
+					new ToType { Name = "SqlBinary"   },
+					new ToType { Name = "SqlBytes"    },
+					new ToType { Name = "SqlChars"    },
+					new ToType { Name = "SqlXml"      },
+				}))
+			.Concat(Set(_ => { _.Group = "Other"; }, new[]
+				{
+					new ToType { Name = "Type",        Method = "ToType",        NonSLMethods = { "Guid", "Guid?", "Binary", "Byte[]" } },
+					new ToType { Name = "Stream",      Method = "ToStream",      NullValue = "Stream.Null" },
+					new ToType { Name = "Byte[]",      Method = "ToByteArray",   NonSLMethods = { "DateTime", "DateTime?", "DateTimeOffset", "DateTimeOffset?" }, Froms = { { "Decimal", null }, { "Stream", null }, { "Char[]", null } } },
+					new ToType { Name = "Char[]",      Method = "ToCharArray",                             },
+					new ToType { Name = "Binary",      Method = "ToLinqBinary",                            },
+					new ToType { Name = "XmlReader",   Method = "ToXmlReader",   NonSilverlightable = true },
+					new ToType { Name = "XmlDocument", Method = "ToXmlDocument", NonSilverlightable = true },
+					new ToType { Name = "XElement",    Method = "ToXElement",    NonSilverlightable = true },
+				}))
+			.ToDictionary(_ => _.Name);
+
+
+		// To Boolean
+		//
+		ConvertFrom("String", "p == null? {2} : p.Length == 1 ? ToBoolean(p[0]) : Boolean.Parse(p)",       "Boolean", "Boolean?", "SqlBoolean");
+		ConvertFrom("Byte[]", "p == null || p.Length == 0 ? {2} : BitConverter.ToBoolean(p, 0)",           "Boolean", "Boolean?", "SqlBoolean");
+		ConvertFrom("Binary", "p == null || p.Length == 0 ? {2} : BitConverter.ToBoolean(p.ToArray(), 0)", "Boolean", "Boolean?", "SqlBoolean");
+
+		ConvertTo    ("Boolean", "p.HasValue && p.Value",                "Boolean?");
+		ConvertToNull("Boolean", "p != 0", "p.HasValue && p.Value != 0", "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal");
+		ConvertTo    ("Boolean", "p.HasValue && ToBoolean(p.Value)",     "Char?");
+		ConvertTo    ("Boolean", "!p.IsNull && p.Value",                 "SqlBoolean");
+		ConvertTo    ("Boolean", "!p.IsNull && ToBoolean(p.Value)",      Sql("String", "Byte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money"));
+
+		ConvertFrom("Boolean", "p",                                "Boolean?", "SqlBoolean");
+		ConvertFrom("Char",    "ToBoolean(p)",                     "Boolean?", "SqlBoolean");
+		ConvertFrom("Char?",   "p.HasValue && ToBoolean(p.Value)", "Boolean?", "SqlBoolean");
+
+		// To Boolean?
+		//		
+		ConvertToNull("Boolean?", "p != 0", "p.HasValue ? p.Value != 0 : {2}", "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal");
+		ConvertTo    ("Boolean?", "p.IsNull ? {2} : p.Value",                  "SqlBoolean");
+		ConvertTo    ("Boolean?", "p.IsNull ? {2} : ToBoolean(p.Value)",       Sql("String", "Byte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money"));
+
+		// SqlBoolean
+		//
+		ConvertTo    ("SqlBoolean", "p.HasValue ? p.Value : {2}",                "Boolean?");
+		ConvertToNull("SqlBoolean", "p != 0", "p.HasValue ? p.Value != 0 : {2}", "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal");
+		ConvertTo    ("SqlBoolean", "p.IsNull ? {2} : ToBoolean(p.Value)",       Sql("String", "Byte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money"));
+
+		// To Byte
+		//
+		ConvertNumber("Byte",
+			new string[] { "Byte" },
+			new string[] { "SByte", "Int16", "Int32", "Int64", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal", "Char" },
+			new string[] { "Byte" },
+			new string[] { "String", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" });
+
+		ConvertFrom("Byte[]", "p == null || p.Length == 0 ? {2} : p[0]",           "Byte", "Byte?", "SqlByte");
+		ConvertFrom("Binary", "p == null || p.Length == 0 ? {2} : p.ToArray()[0]", "Byte", "Byte?", "SqlByte");
+
+		// To Char
+		//
+		ConvertNumber("Char",
+			new string[] { "Char" },
+			new string[] { "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal" },
+			new string[] { },
+			new string[] { "String", "Byte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" });
+
+		ConvertFrom("String", "string.IsNullOrEmpty(p)? ({0})0 : p[0]", "Char", "Char?");
+
+		// To DateTime
+		//
+		ConvertTo(new[] { "DateTime",  "SqlDateTime" }, "p.HasValue ? p.Value : {2}", "DateTime?");
+		ConvertTo(new[] { "DateTime?", "SqlDateTime" }, "p",                          "DateTime");
+		ConvertTo(new[] { "DateTime",  "DateTime?"   }, "p.IsNull ? {2} : p.Value",   "SqlDateTime");
+		
+		ConvertFrom("String",          "p == null ? {2} : {3}.Parse(p, null, DateTimeStyles.NoCurrentDateDefault)", "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("TimeSpan",        "{3}.MinValue + p",                                                          "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("Int64",           "{3}.MinValue + TimeSpan.FromTicks(p)",                                      "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("Double",          "{3}.MinValue + TimeSpan.FromDays (p)",                                      "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("DateTimeOffset",  "p.LocalDateTime",                                                           "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("DateTimeOffset?", "p.HasValue ?                     p.Value.LocalDateTime : {2}",              "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("TimeSpan?",       "p.HasValue ? {3}.MinValue +                    p.Value : {2}",              "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("Int64?",          "p.HasValue ? {3}.MinValue + TimeSpan.FromTicks(p.Value): {2}",              "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("Double?",         "p.HasValue ? {3}.MinValue + TimeSpan.FromDays (p.Value): {2}",              "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("SqlDateTime",     "p.IsNull   ? {2} :                                   p.Value",              "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("SqlString",       "p.IsNull   ? {2} :                             To{3}(p.Value)",             "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("SqlInt64",        "p.IsNull   ? {2} : {3}.MinValue + TimeSpan.FromTicks(p.Value)",             "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("SqlDouble",       "p.IsNull   ? {2} : {3}.MinValue + TimeSpan.FromDays (p.Value)",             "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("Byte[]",          "p == null || p.Length == 0 ? {2} : {3}.FromBinary(ToInt64(p))",             "DateTime", "DateTime?", "SqlDateTime");
+		ConvertFrom("Binary",          "p == null || p.Length == 0 ? {2} : {3}.FromBinary(ToInt64(p.ToArray()))",   "DateTime", "DateTime?", "SqlDateTime");
+
+		// To DateTimeOffset
+		//
+		ConvertTo("DateTimeOffset",  "p.HasValue ? p.Value : {2}", "DateTimeOffset?");
+		ConvertTo("DateTimeOffset?", "p",                          "DateTimeOffset");
+
+		ConvertFrom("TimeSpan",    "{3}.MinValue + p",                                                    "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("Int64",       "{3}.MinValue + TimeSpan.FromTicks(p)",                                "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("Double",      "{3}.MinValue + TimeSpan.FromDays (p)",                                "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("DateTime",    "p",                                                                   "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("DateTime?",   "p.HasValue ?                                   p.Value : {2}",        "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("TimeSpan?",   "p.HasValue ? {3}.MinValue +                    p.Value : {2}",        "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("Int64?",      "p.HasValue ? {3}.MinValue + TimeSpan.FromTicks(p.Value): {2}",        "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("Double?",     "p.HasValue ? {3}.MinValue + TimeSpan.FromDays (p.Value): {2}",        "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("SqlDateTime", "p.IsNull   ? {2} :                                   p.Value",        "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("SqlString",   "p.IsNull   ? {2} :                  ToDateTimeOffset(p.Value)",       "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("SqlInt64",    "p.IsNull   ? {2} : {3}.MinValue + TimeSpan.FromTicks(p.Value)",       "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("SqlDouble",   "p.IsNull   ? {2} : {3}.MinValue + TimeSpan.FromDays (p.Value)",       "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("Byte[]",      "p == null || p.Length == 0 ? {2} : new {0}(ToDateTime(p))",           "DateTimeOffset", "DateTimeOffset?");
+		ConvertFrom("Binary",      "p == null || p.Length == 0 ? {2} : new {0}(ToDateTime(p.ToArray()))", "DateTimeOffset", "DateTimeOffset?");
+
+		// To Decimal
+		//
+		ConvertNumber("Decimal",
+			new string[] { "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "Char", "UInt64", "Decimal" },
+			new string[] { "Single", "Double" },
+			new string[] { "Byte", "Int16", "Int32", "Int64", "Decimal", "Money" },
+			new string[] { "String", "Single", "Double", "Boolean" });
+
+		ConvertNumber("Money",
+			new string[] { "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "Char", "UInt64", "Decimal" },
+			new string[] { "Single", "Double" },
+			new string[] { "Byte", "Int16", "Int32", "Int64", "Decimal", "Money" },
+			new string[] { "String", "Single", "Double", "Boolean" });
+
+		ConvertTo(new[] { "Decimal?", "SqlDecimal", "SqlMoney" }, "p == null || p.Length == 0 ? {2} : ToDecimal(p)", "Byte[]", "Binary");
+
+		// To Double
+		//
+		ConvertTo(new[] { "Double", "Double?", "SqlDouble" }, "(p - {1}.MinValue).TotalDays",          "DateTime", "DateTimeOffset");
+		ConvertTo("SqlDouble",                                "p.IsNull? {0}.Null: ToDouble(p.Value)", "SqlDateTime");
+
+		ConvertNumber("Double",
+			new string[] { "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "Char", "UInt64", "Single", "Double" },
+			new string[] { "Decimal" },
+			new string[] { "Byte", "Int16", "Int32", "Int64", "Single", "Double" },
+			new string[] { "String", "Decimal", "Money", "Boolean", "DateTime" });
+
+		ConvertTo(new[] { "Double", "Double?", "SqlDouble" }, "p.HasValue ? (p.Value - {4}.MinValue).TotalDays : {2}", "DateTime?", "DateTimeOffset?");
+
+		ConvertFrom("TimeSpan",  "p.TotalDays",                          "Double", "Double?", "SqlDouble");
+		ConvertFrom("TimeSpan?", "p.HasValue ? p.Value.TotalDays : {2}", "Double", "Double?", "SqlDouble");
+
+		// To Guid
+		//
+		ConvertTo(new[] { "Guid",  "SqlGuid" }, "p.HasValue ? p.Value : {2}", "Guid?");
+		ConvertTo(new[] { "Guid?", "SqlGuid" }, "p",                          "Guid");
+		ConvertTo(new[] { "Guid",  "Guid?"   }, "p.IsNull ? {2} : p.Value",   "SqlGuid");
+
+		ConvertTo(new[] { "Guid", "Guid?", "SqlGuid" },  "p == null ? {2} : new Guid(p)", "String", "Byte[]");
+		
+		ConvertFrom("SqlGuid",   "p.IsNull  ? {2} : p.Value",               "Guid", "Guid?", "SqlGuid");
+		ConvertFrom("SqlString", "p.IsNull  ? {2} : new Guid(p.Value)",     "Guid", "Guid?", "SqlGuid");
+		ConvertFrom("SqlBinary", "p.IsNull  ? {2} : p.ToSqlGuid().Value",   "Guid", "Guid?", "SqlGuid");
+		ConvertFrom("Binary",    "p == null ? {2} : new Guid(p.ToArray())", "Guid", "Guid?", "SqlGuid");
+		ConvertFrom("Type",      "p == null ? {2} : p.GUID",                "Guid", "Guid?", "SqlGuid");
+
+		// To Int16
+		//
+		ConvertNumber("Int16",
+			new string[] { "SByte", "Int16", "Byte" },
+			new string[] { "Int32", "Int64", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal", "Char" },
+			new string[] { "Byte", "Int16" },
+			new string[] { "String", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" });
+
+		// To Int32
+		//
+		ConvertNumber("Int32",
+			new string[] { "SByte", "Int16", "Int32", "Byte", "UInt16", "Char" },
+			new string[] { "Int64", "UInt32", "UInt64", "Single", "Double", "Decimal" },
+			new string[] { "Byte", "Int16", "Int32" },
+			new string[] { "String", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" });
+
+		// To Int64
+		//
+		ConvertTo("Int64",    "(p - DateTime.MinValue).Ticks", "DateTime", "DateTimeOffset");
+		ConvertTo("Int64?",   "(p - DateTime.MinValue).Ticks", "DateTime", "DateTimeOffset");
+		ConvertTo("SqlInt64", "(p - DateTime.MinValue).Ticks", "DateTime", "DateTimeOffset");
+		ConvertTo("SqlInt64", "p.IsNull? {0}.Null: ToInt64(p.Value)",      "SqlDateTime");
+
+		ConvertNumber("Int64",
+			new string[] { "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "Char" },
+			new string[] { "UInt64", "Single", "Double", "Decimal" },
+			new string[] { "Byte", "Int16", "Int32", "Int64" },
+			new string[] { "String", "Single", "Double", "Decimal", "Money", "Boolean", "DateTime" });
+
+		ConvertTo("Int64",  "  p.HasValue ? (p.Value - DateTime.MinValue).Ticks : 0", "DateTime?", "DateTimeOffset?");
+		ConvertTo("Int64?",   "p.HasValue ? (p.Value - DateTime.MinValue).Ticks : 0", "DateTime?", "DateTimeOffset?");
+		ConvertTo("SqlInt64", "p.HasValue ? (p.Value - DateTime.MinValue).Ticks : 0", "DateTime?", "DateTimeOffset?");
+
+		ConvertFrom("TimeSpan",  "p.Ticks",                        "Int64", "Int64?", "SqlInt64");
+		ConvertFrom("TimeSpan?", "p.HasValue ? p.Value.Ticks : 0", "Int64", "Int64?", "SqlInt64");
+
+		// To SByte
+		//
+		ConvertNumber("SByte",
+			new string[] { "SByte" },
+			new string[] { "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "UInt64", "Single", "Double", "Decimal", "Char" },
+			new string[] { },
+			new string[] { "String", "Byte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" });
+
+		ConvertFrom("Byte[]", "p == null || p.Length == 0 ? {2} : checked(({0})p[0])",           "SByte", "SByte?");
+		ConvertFrom("Binary", "p == null || p.Length == 0 ? {2} : checked(({0})p.ToArray()[0])", "SByte", "SByte?");
+
+		// To Single
+		//
+		ConvertNumber("Single",
+			new string[] { "SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "Char", "UInt64", "Single" },
+			new string[] { "Double", "Decimal" },
+			new string[] { "Byte", "Int16", "Int32", "Int64", "Single" },
+			new string[] { "String", "Double", "Decimal", "Money", "Boolean" });
+
+		// To String
+		//
+		ConvertToNull(new[] { "String", "SqlString" },
+			"p.To{3}()",
+			"p.HasValue ? p.Value.To{3}() : {2}",
+				"SByte", "Int16", "Int32", "Int64", "Byte", "UInt16", "UInt32", "UInt64",
+				"Single", "Double", "Boolean", "Decimal", "Char", "TimeSpan", "DateTime", "DateTimeOffset", "Guid");
+
+		ConvertTo(new[] { "String", "SqlString" }, "p == null ? {2} : p.FullName",                                          "Type");
+		ConvertTo(new[] { "String", "SqlString" }, "p == null ? {2} : System.Text.Encoding.UTF8.GetString(p, 0, p.Length)", "Byte[]");
+		ConvertTo(new[] { "String", "SqlString" }, "To{0}(p.ToArray())",                                                    "Binary");
+
+		ConvertTo(new[] { "String", "SqlString" }, "p.To{0}()",
+			Sql("String", "Byte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean", "Guid"));
+
+		ConvertTo(        "String",                "p.IsNull ? {2} : p.ToSqlString().Value", "SqlChars");
+		ConvertTo(new[] { "String", "SqlString" }, "p.IsNull ? {2} : p.Value",               "SqlXml");
+		ConvertTo(new[] { "String", "SqlString" }, "p == null ? {2} : p.InnerXml",           "XmlDocument");
+		ConvertTo(new[] { "String", "SqlString" }, "p == null ? {2} : p.ToString()",         "XElement");
+
+		ConvertTo("SqlString", "p ?? {2}",  "String");
+		ConvertTo("SqlString", "p.To{0}()", "SqlChars");
+
+		// To TimeSpan
+		// 
+		ConvertTo("TimeSpan",  "p.HasValue ? p.Value : {2}", "TimeSpan?");
+		ConvertTo("TimeSpan?", "p",                          "TimeSpan");
+
+		ConvertFrom("DateTime",        "p - DateTime.MinValue",                                                 "TimeSpan", "TimeSpan?");
+		ConvertFrom("DateTimeOffset",  "p - DateTimeOffset.MinValue",                                           "TimeSpan", "TimeSpan?");
+		ConvertFrom("Int64",           "TimeSpan.FromTicks(p)",                                                 "TimeSpan", "TimeSpan?");
+		ConvertFrom("Double",          "TimeSpan.FromDays (p)",                                                 "TimeSpan", "TimeSpan?");
+		ConvertFrom("DateTime?",       "p.HasValue ? p.Value - DateTime.MinValue       : {2}",                  "TimeSpan", "TimeSpan?");
+		ConvertFrom("DateTimeOffset?", "p.HasValue ? p.Value - DateTimeOffset.MinValue : {2}",                  "TimeSpan", "TimeSpan?");
+		ConvertFrom("Int64?",          "p.HasValue ? {3}.FromTicks(p.Value)            : {2}",                  "TimeSpan", "TimeSpan?");
+		ConvertFrom("Double?",         "p.HasValue ? {3}.FromDays (p.Value)            : {2}",                  "TimeSpan", "TimeSpan?");
+		ConvertFrom("SqlString",       "p.IsNull   ? {2} : {3}.Parse(p.Value)",                                 "TimeSpan", "TimeSpan?");
+		ConvertFrom("SqlDateTime",     "p.IsNull   ? {2} : p.Value - DateTime.MinValue",                        "TimeSpan", "TimeSpan?");
+		ConvertFrom("SqlInt64",        "p.IsNull   ? {2} : {3}.FromTicks(p.Value)",                             "TimeSpan", "TimeSpan?");
+		ConvertFrom("SqlDouble",       "p.IsNull   ? {2} : {3}.FromDays(p.Value)",                              "TimeSpan", "TimeSpan?");
+		ConvertFrom("Byte[]",          "p == null || p.Length == 0? {2} : {3}.FromTicks(ToInt64(p))",           "TimeSpan", "TimeSpan?");
+		ConvertFrom("Binary",          "p == null || p.Length == 0? {2} : {3}.FromTicks(ToInt64(p.ToArray()))", "TimeSpan", "TimeSpan?");
+
+		// To UInt16
+		//
+		ConvertNumber("UInt16",
+			new string[] { "UInt16", "Byte" },
+			new string[] { "SByte", "Int16", "Int32", "Int64", "UInt32", "UInt64", "Single", "Double", "Decimal", "Char" },
+			new string[] { "Byte" },
+			new string[] { "String", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" });
+
+		// To UInt32
+		//
+		ConvertNumber("UInt32",
+			new string[] { "Byte", "UInt16", "UInt32" },
+			new string[] { "SByte", "Int16", "Int32", "Int64", "UInt64", "Single", "Double", "Decimal", "Char" },
+			new string[] { "Byte" },
+			new string[] { "String", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" });
+
+		// To UInt64
+		//
+		ConvertNumber("UInt64",
+			new string[] { "Byte", "UInt16", "UInt32", "UInt64" },
+			new string[] { "SByte", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Char" },
+			new string[] { "Byte" },
+			new string[] { "String", "Int16", "Int32", "Int64", "Single", "Double", "Decimal", "Money", "Boolean" });
+
+		// To SqlBinary
+		//
+		ConvertTo("SqlBinary", "p", "Byte[]");
+		ConvertTo("SqlBinary", "p == null ?      {2} : p.ToArray()",                   "Binary");
+		ConvertTo("SqlBinary", "p == Guid.Empty? {2} : new SqlGuid(p).To{0}()",        "Guid");
+		ConvertTo("SqlBinary", "p.HasValue ? new SqlGuid(p.Value).ToSqlBinary(): {2}", "Guid?");
+		ConvertTo("SqlBinary", "p.To{0}()",                                            "SqlBytes" , "SqlGuid");
+
+		// To SqlXml
+		//
+		ConvertTo("SqlXml", "p == null ? {2} : new {0}(new XmlTextReader(new StringReader(p)))",                    "String");
+		ConvertTo("SqlXml", "p == null ? {2} : new {0}(p)",                                                         "Stream", "XmlReader");
+		ConvertTo("SqlXml", "p == null ? {2} : new {0}(new XmlTextReader(new StringReader(p.InnerXml)))",           "XmlDocument");
+		ConvertTo("SqlXml", "p == null ? {2} : new {0}(new XmlTextReader(new StringReader(p.ToString())))",         "XElement");
+		ConvertTo("SqlXml", "p == null ? {2} : new {0}(new XmlTextReader(new StringReader(new string(p))))",        "Char[]");
+		ConvertTo("SqlXml", "p == null ? {2} : new {0}(new MemoryStream(p))",                                       "Byte[]");
+		ConvertTo("SqlXml", "p == null ? {2} : new {0}(new MemoryStream(p.ToArray()))",                             "Binary");
+		ConvertTo("SqlXml", "p.IsNull ? {2} : new {0}(new XmlTextReader(new StringReader(p.Value)))",               "SqlString");
+		ConvertTo("SqlXml", "p.IsNull ? {2} : new {0}(new XmlTextReader(new StringReader(p.ToSqlString().Value)))", "SqlChars");
+		ConvertTo("SqlXml", "p.IsNull ? {2} : new {0}(new MemoryStream(p.Value))",                                  "SqlBinary");
+		ConvertTo("SqlXml", "p.IsNull ? {2} : new {0}(p.Stream)",                                                   "SqlBytes");
+
+		// To Stream
+		// 
+		ConvertTo("Stream", "p == Guid.Empty ? {2} : new MemoryStream(p.ToByteArray())",  "Guid");
+		ConvertTo("Stream", "p == null ? {2} : new MemoryStream(p)",                      "Byte[]");
+		ConvertTo("Stream", "p == null ? {2} : new MemoryStream(p.ToArray())",            "Binary");
+		ConvertTo("Stream", "p.HasValue ? new MemoryStream(p.Value.ToByteArray()) : {2}", "Guid?");
+		ConvertTo("Stream", "p.IsNull ? {2} : p.Stream",                                  "SqlBytes");
+		ConvertTo("Stream", "p.IsNull ? {2} : new MemoryStream(p.Value)",                 "SqlBinary");
+		ConvertTo("Stream", "p.IsNull ? {2} : new MemoryStream(p.Value.ToByteArray())",   "SqlGuid");
+
+		// To Type
+		//
+		ConvertTo("Type", "p == null ? {2} : Type.GetType(p)",                            "String");
+		ConvertTo("Type", "p == null ? {2} : Type.GetType(new string(p))",                "Char[]");
+		ConvertTo("Type", "p == null ? {2} : Type.GetTypeFromCLSID(ToGuid(p))",           "Byte[]");
+		ConvertTo("Type", "p == null ? {2} : Type.GetTypeFromCLSID(ToGuid(p.ToArray()))", "Binary");
+		ConvertTo("Type", "p == Guid.Empty ? {2} : Type.GetTypeFromCLSID(p)",             "Guid");
+		ConvertTo("Type", "p.HasValue ? Type.GetTypeFromCLSID(p.Value) : {2}",            "Guid?");
+		ConvertTo("Type", "p.IsNull ? {2} : Type.GetType(p.Value)",                       "SqlString");
+		ConvertTo("Type", "p.IsNull ? {2} : Type.GetType(new string(p.Value))",           "SqlChars");
+		ConvertTo("Type", "p.IsNull ? {2} : Type.GetTypeFromCLSID(p.Value)",              "SqlGuid");
+
+		// To Byte[]
+		//
+		ConvertTo("Byte[]", "p == null ? {2} : System.Text.Encoding.UTF8.GetBytes(p)", "String");
+		ConvertTo("Byte[]", "new[] {{ p }}",                                           "Byte");
+		ConvertTo("Byte[]", "new[] {{ checked((Byte)p) }}",                            "SByte");
+		ConvertTo("Byte[]", "ToByteArray(p.ToBinary())",                               "DateTime");
+		ConvertTo("Byte[]", "ToByteArray(p.LocalDateTime.ToBinary())",                 "DateTimeOffset");
+		ConvertTo("Byte[]", "p == null ? {2} : p.ToArray()",                           "Binary");
+		ConvertTo("Byte[]", "ToByteArray(p.Ticks)",                                    "TimeSpan");
+		ConvertTo("Byte[]", "p == Guid.Empty ? {2} : p.ToByteArray()",                 "Guid");
+
+		ConvertTo("Byte[]", "BitConverter.GetBytes(p)",
+			"Int16", "Int32", "Int64", "UInt16", "UInt32", "UInt64", "Single", "Double", "Boolean", "Char");
+		ConvertTo("Byte[]", "p.HasValue ? ToByteArray(p.Value) : {2}",
+			"SByte?", "Int16?", "Int32?", "Int64?", "Byte?", "UInt16?", "UInt32?", "UInt64?", "Single?", "Double?", "Boolean?", "Decimal?", "Char?", "DateTime?", "DateTimeOffset?", "TimeSpan?", "Guid?");
+
+		ConvertTo("Byte[]", "p.IsNull ? {2} : p.Value",         "SqlBinary", "SqlBytes");
+		ConvertTo("Byte[]", "p.IsNull ? {2} : p.ToByteArray()", "SqlGuid");
+		ConvertTo("Byte[]", "p.IsNull ? {2} : ToByteArray(p.Value)",
+			"SqlString", "SqlByte", "SqlInt16", "SqlInt32", "SqlInt64", "SqlSingle", "SqlDouble", "SqlDecimal", "SqlMoney", "SqlBoolean");
+
+		// To SqlBytes
+		//
+		ConvertTo("SqlBytes", "p == null ? {2} : new {0}(p)",                      "Byte[]", "Stream");
+		ConvertTo("SqlBytes", "p == null ? {2} : new {0}(p.ToArray())",            "Binary");
+		ConvertTo("SqlBytes", "p == Guid.Empty ? {2}: new {0}(p.ToByteArray())",   "Guid");
+		ConvertTo("SqlBytes", "p.HasValue ? new {0}(p.Value.ToByteArray()) : {2}", "Guid?");
+		ConvertTo("SqlBytes", "p.IsNull ? {2} : new {0}(p)",                       "SqlBinary");
+		ConvertTo("SqlBytes", "p.IsNull ? {2} : new {0}(p.ToByteArray())",         "SqlGuid");
+
+		ConvertTo("SqlBytes", "p == null ? {2} : new {0}(ToByteArray(p))",         "String");
+		
+		ConvertTo("SqlBytes", "new {0}(ToByteArray(p))",
+			"Byte", "SByte", "DateTime", "DateTimeOffset", "TimeSpan", "Int16", "Int32", "Int64", "UInt16", "UInt32", "UInt64", "Single", "Double", "Boolean", "Char");
+		ConvertTo("SqlBytes", "p.HasValue ? ToSqlBytes(p.Value) : {2}",
+			"SByte?", "Int16?", "Int32?", "Int64?", "Byte?", "UInt16?", "UInt32?", "UInt64?", "Single?", "Double?", "Boolean?", "Decimal?", "Char?", "DateTime?", "DateTimeOffset?", "TimeSpan?", "Guid?");
+
+		ConvertTo("Byte[]", "p.IsNull ? {2} : ToSqlBytes(p.Value)",
+			"SqlString", "SqlByte", "SqlInt16", "SqlInt32", "SqlInt64", "SqlSingle", "SqlDouble", "SqlDecimal", "SqlMoney", "SqlBoolean");
+
+
+
+		string[] numberTypes1  = new string[] { "Int16", "Int32", "Int64", "UInt16", "UInt32", "UInt64", "Char", "Single", "Double", "SqlByte", "SqlInt16", "SqlInt32", "SqlInt64", "SqlSingle", "SqlDouble", "SqlDecimal", "SqlMoney" };
+		string[] numberTypes2  = Add(numberTypes1, "SByte", "Byte");
+		string[] numberTypes1n = numberTypes1.Where(_ => !_.StartsWith("Sql")).Select(_ => _ + "?").ToArray();
+		string[] numberTypes2n = numberTypes2.Where(_ => !_.StartsWith("Sql")).Select(_ => _ + "?").ToArray();
+
+		// From String
+		//
+		ConvertFrom("String", "p == null? {2} : {3}.Parse(p)",
+			Add(Add(numberTypes2, numberTypes2n), "Decimal", "DateTimeOffset", "TimeSpan", "Decimal?", "DateTimeOffset?", "TimeSpan?"));
+
+		// From Boolean
+		//
+		ConvertFrom("Boolean", "p ? ({0})1 : ({0})0",                     Add(Add(numberTypes2, numberTypes2n), "Decimal", "Decimal?"));
+
+		// From Boolean?
+		//
+		ConvertFrom("Boolean?", "p.HasValue && p.Value ? ({0})1: ({0})0", Add(Add(numberTypes2, numberTypes2n), "Decimal", "Decimal?"));
+
+		// From Byte[]
+		//
+		ConvertFrom("Byte[]", "p == null || p.Length == 0 ? {2} : BitConverter.To{3}(p, 0)",           Add(numberTypes1, numberTypes1n));
+
+		// From Binary
+		//
+		ConvertFrom("Binary", "p == null || p.Length == 0 ? {2} : BitConverter.To{3}(p.ToArray(), 0)", Add(numberTypes1, numberTypes1n));
+
+		Generate();
+#>
+	}
+}
+<#+
+class ToType
+{
+	public string Group;
+	public string Name;
+	public string Method;
+	public bool   NonCompliant;
+	public bool   NonSilverlightable; // :)
+	public string NullValue;
+	public string FromObjectReturn;
+
+	public Dictionary<string,string> Froms        = new Dictionary<string,string>();
+	public HashSet<string>           NonSLMethods = new HashSet<string>();
+}
+
+Dictionary<string,ToType> _types;
+
+void ConvertTo(string toType, string convertText, params string[] fromTypes)
+{
+	foreach (string fromType in fromTypes)
+	{
+		if (toType == fromType)
+			continue;
+
+		if (!_types.ContainsKey(fromType))
+			throw new InvalidOperationException(fromType);
+
+		if (!_types[toType].Froms.ContainsKey(fromType))
+			_types[toType].Froms.Add(fromType, string.Format(
+				convertText,
+				toType,
+				fromType,
+				_types[toType].NullValue ?? "(" + toType + ")null",
+				toType.  TrimEnd('?').Replace("Sql", "").Replace("Money", "Decimal"),
+				fromType.TrimEnd('?').Replace("Sql", "").Replace("Money", "Decimal")));
+	}
+}
+
+void ConvertTo(string[] toTypes, string convertText, params string[] fromTypes)
+{
+	foreach (var t in toTypes)
+		ConvertTo(t, convertText, fromTypes);
+}
+
+void ConvertFrom(string fromType, string convertText, params string[] toTypes)
+{
+	foreach (string toType in toTypes)
+		ConvertTo(toType, convertText, fromType);
+}
+
+void ConvertToNull(string toType, string convertText, string convertTextNull, params string[] fromTypes)
+{
+	ConvertTo(toType, convertText,     fromTypes);
+	ConvertTo(toType, convertTextNull, fromTypes.Select(_ => _ + "?").ToArray());
+}
+
+void ConvertToNull(string[] toTypes, string convertText, string convertTextNull, params string[] fromTypes)
+{
+	foreach (var t in toTypes)
+		ConvertToNull(t, convertText, convertTextNull, fromTypes);
+}
+
+void ConvertNumber(string toType, string[] types1, string[] types2, string[] types3, string[] types4)
+{
+	if (toType != "Money")
+	{
+		ConvertToNull(toType,
+			"p",
+			"p.HasValue ? p.Value : {2}",
+			types1);
+		ConvertToNull(toType,
+			"checked(({0})p)",
+			"p.HasValue ? checked(({0})p.Value) : {2}",
+			types2);
+		ConvertTo(toType, "p.IsNull ? {2} : p.Value",        Sql(types3));
+		ConvertTo(toType, "p.IsNull ? {2} : To{0}(p.Value)", Sql(types4));
+
+		ConvertToNull(toType + "?",
+			"p",
+			"p.HasValue ? p.Value : {2}",
+			types1);
+		ConvertToNull(toType + "?",
+			"checked(({0})p)",
+			"p.HasValue ? checked(({0})p.Value) : {2}",
+			types2);
+		ConvertTo(toType + "?", "p.IsNull ? {2} : p.Value",        Sql(types3));
+		ConvertTo(toType + "?", "p.IsNull ? {2} : To{3}(p.Value)", Sql(types4));
+	}
+
+	if (_types.ContainsKey("Sql" + toType))
+	{
+		ConvertToNull("Sql" + toType,
+			"p",
+			"p.HasValue ? p.Value : {2}",
+			types1);
+		ConvertToNull("Sql" + toType,
+			"checked(({3})p)",
+			"p.HasValue ? checked(({3})p.Value) : {2}",
+			types2);
+		ConvertTo("Sql" + toType, "p.To{0}()", Sql(types3));
+		ConvertTo("Sql" + toType, "p.To{0}()", Sql(types4));
+	}
+}
+
+string[] Sql(params string[] types)
+{
+	return types.Select(_ => "Sql" + _).ToArray();
+}
+
+string[] Add(string[] str1, params string[] str2)
+{
+	return str1.Concat(str2).ToArray();
+}
+
+IEnumerable<ToType> Set(Action<ToType> action, IEnumerable<ToType> types)
+{
+	foreach (var t in types)
+	{
+		action(t);
+		yield return t;
+	}
+}
+
+string LenDiff(int max, string str)
+{
+	var s = "";
+
+	while (max-- > str.Length)
+		s += " ";
+
+	return s;
+}
+
+Dictionary<string,int> _groupOrder = new Dictionary<string,int>
+{
+	{ "Simple",   1 },
+	{ "Nullable", 2 },
+	{ "Sql",      3 },
+	{ "Other",    4 },
+};
+
+HashSet<string> _codedTypes = new HashSet<string>
+{
+	"Boolean", "Char", "SByte", "Byte", "Int16", "UInt16", "Int32", "UInt32", "Int64", "UInt64", "Single", "Double", "Decimal", "DateTime", "String",
+};
+
+void Generate()
+{
+	PushIndent("\t\t");
+
+	foreach (var gr in _types.Values.Select(_ => _.Group).Distinct())
+	{
+		WriteLine("");
+		WriteLine("#region {0} Types", gr);
+
+		foreach (var to in
+			from t in _types.Values
+			where t.Group == gr
+			orderby t.Name
+			select t)
+		{
+			WriteLine("");
+			WriteLine("#region {0}", to.Name);
+			
+			var froms = from f in to.Froms.Keys select f;
+
+			if (to.NonSilverlightable)
+			{
+				ClearIndent();
+				WriteLine("");
+				WriteLine("#if !SILVERLIGHT");
+				PushIndent("\t\t");
+
+				froms =
+					from f in froms
+					orderby _groupOrder[_types[f].Group], _types[f].Name
+					select f;
+			}
+			else
+			{
+				froms =
+					from f in froms
+					orderby _types[f].NonSilverlightable, _groupOrder[_types[f].Group], _types[f].Name
+					select f;
+			}
+
+			var group = "";
+			var sl    = false;
+			var len   = froms.Concat(new[] { "" }).Select(_ => _.Length).Max();
+			var lcode = to.Froms.Values.Concat(new[] { "" }).Select(_ => (_ ?? "").Length).Max();
+
+			foreach (var f in froms)
+			{
+				var code = to.Froms[f];
+
+				if (code == null)
+					continue;
+
+				var fr = _types[f];
+
+				if (!to.NonSilverlightable && sl != fr.NonSilverlightable)
+				{
+					sl = fr.NonSilverlightable;
+
+					ClearIndent();
+					WriteLine("");
+					WriteLine("#if !SILVERLIGHT");
+					PushIndent("\t\t");
+				}
+
+				if (fr.Group != group)
+				{
+					group = fr.Group;
+
+					WriteLine("");
+					WriteLine("// {0} Types", group);
+					WriteLine("//");
+				}
+
+				if (to.NonSLMethods.Contains(fr.Name))
+				{
+					ClearIndent();
+					WriteLine("#if !SILVERLIGHT");
+					PushIndent("\t\t");
+				}
+
+				WriteLine("/// <summary>Converts the value from <c>{0}</c> to an equivalent <c>{1}</c> value.</summary>", fr.Name, to.Name);
+
+				if (to.NonCompliant || fr.NonCompliant)
+					WriteLine("[CLSCompliant(false)]");
+
+				WriteLine("public static {0} {1}({2}{3} p) {{ return {4};{5} }}",
+					to.Name, to.Method, fr.Name, LenDiff(len, fr.Name), code, LenDiff(lcode, code));
+
+				if (to.NonSLMethods.Contains(fr.Name))
+				{
+					ClearIndent();
+					WriteLine("#endif");
+					PushIndent("\t\t");
+				}
+			}
+
+			if (sl)
+			{
+				ClearIndent();
+				WriteLine("");
+				WriteLine("#endif");
+				PushIndent("\t\t");
+			}
+
+			// From Object
+			//
+			if (to.Froms.Count > 0)
+			{
+				WriteLine("");
+				WriteLine("// From Object");
+				WriteLine("//");
+
+				WriteLine("/// <summary>Converts the value from <c>Object</c> to an equivalent <c>{0}</c> value.</summary>", to.Name);
+
+				if (to.NonCompliant)
+					WriteLine("[CLSCompliant(false)]");
+
+				WriteLine("public static {0} {1}(object p)", to.Name, to.Method);
+				WriteLine("{");
+
+				PushIndent("\t");
+
+				var defType = false;
+
+				var tc =
+					from f in to.Froms.Keys
+					where _codedTypes.Contains(f)
+					select f;
+
+				if (tc.Any())
+				{
+					WriteLine("if (p == null) return {0};", to.NullValue ?? "null");
+					WriteLine("");
+
+					if (!_codedTypes.Contains(to.Name))
+					{
+						WriteLine("if (p is {0}) return ({0})p;", to.Name);
+						WriteLine("");
+					}
+
+					defType = true;
+
+					WriteLine("var type = p.GetType();");
+					WriteLine("");
+					WriteLine("// Primitive types");
+					WriteLine("//");
+					WriteLine("switch (Type.GetTypeCode(type))");
+					WriteLine("{");
+					PushIndent("\t");
+
+					len = new[] { to.Name, "DBNull" }.Concat(tc).Select(_ => _.Length).Max();
+
+					WriteLine("case TypeCode.DBNull{0} : return {1};", LenDiff(len, "DBNull"), to.NullValue ?? "null");
+
+					if (_codedTypes.Contains(to.Name))
+						WriteLine("case TypeCode.{0}{1} : return ({0})p;", to.Name, LenDiff(len, to.Name));
+
+					foreach (var t in tc)
+					{
+						if (to.NonSLMethods.Contains(t))
+						{
+							ClearIndent();
+							WriteLine("#if !SILVERLIGHT");
+							PushIndent("\t\t");
+							PushIndent("\t");
+							PushIndent("\t");
+						}
+
+						WriteLine("case TypeCode.{0}{1} : return {2}(({0}){1}p);", t, LenDiff(len, t), to.Method);
+
+						if (to.NonSLMethods.Contains(t))
+						{
+							ClearIndent();
+							WriteLine("#endif");
+							PushIndent("\t\t");
+							PushIndent("\t");
+							PushIndent("\t");
+						}
+					}
+
+					PopIndent();
+					WriteLine("}");
+				}
+				else
+				{
+					WriteLine("if (p == null || p is DBNull) return {0};", to.NullValue ?? "null");
+					WriteLine("");
+					WriteLine("if (p is {0}) return ({0})p;", to.Name);
+				}
+
+				tc =
+					from f in to.Froms.Keys
+					where !_codedTypes.Contains(f)
+					select f;
+
+				if (to.NonSilverlightable)
+				{
+					tc =
+						from f in tc
+						orderby _groupOrder[_types[f].Group], _types[f].Name
+						select f;
+				}
+				else
+				{
+					tc =
+						from f in tc
+						orderby _types[f].NonSilverlightable, _groupOrder[_types[f].Group], _types[f].Name
+						select f;
+				}
+
+				var openGroupBlock = false;
+
+				group = "";
+				sl    = false;
+				len   = new[] { "" }.Concat(tc).Select(_ => _.Length).Max();
+
+				foreach (var f in tc)
+				{
+					var fr = _types[f];
+
+					if (!to.NonSilverlightable && sl != fr.NonSilverlightable)
+					{
+						sl = fr.NonSilverlightable;
+
+						ClearIndent();
+						WriteLine("");
+						WriteLine("#if !SILVERLIGHT");
+						PushIndent("\t\t");
+						PushIndent("\t");
+					}
+
+					if (fr.Group != group)
+					{
+						group = fr.Group;
+
+						if (openGroupBlock)
+						{
+							openGroupBlock = false;
+							PopIndent();
+							WriteLine("}");
+						}
+
+						WriteLine("");
+						WriteLine("// {0} Types", group);
+						WriteLine("//");
+
+						if (group == "Nullable")
+						{
+							openGroupBlock = true;
+
+							if (!defType)
+							{
+								defType = true;
+								WriteLine("var type = p.GetType();");
+								WriteLine("");
+							}
+
+							WriteLine("if (type.IsGenericType)");
+							WriteLine("{");
+							
+							PushIndent("\t");
+						}
+						else if (group == "Sql")
+						{
+							openGroupBlock = true;
+
+							WriteLine("if (p is INullable)");
+							WriteLine("{");
+							
+							PushIndent("\t");
+						}
+					}
+
+					if (to.NonSLMethods.Contains(fr.Name))
+					{
+						ClearIndent();
+						WriteLine("#if !SILVERLIGHT");
+						PushIndent("\t\t");
+						PushIndent("\t");
+						if (openGroupBlock)
+							PushIndent("\t");
+					}
+
+					WriteLine("if (p is {0}){1} return {2}(({0}){1}p);", fr.Name, LenDiff(len, fr.Name), to.Method);
+
+					if (to.NonSLMethods.Contains(fr.Name))
+					{
+						ClearIndent();
+						WriteLine("#endif");
+						PushIndent("\t\t");
+						PushIndent("\t");
+						if (openGroupBlock)
+							PushIndent("\t");
+					}
+				}
+
+				if (openGroupBlock)
+				{
+					PopIndent();
+					WriteLine("}");
+				}
+
+				if (sl)
+				{
+					ClearIndent();
+					WriteLine("");
+					WriteLine("#endif");
+					PushIndent("\t\t");
+					PushIndent("\t");
+				}
+
+				if (_codedTypes.Contains(to.Name))
+				{
+					WriteLine("");
+					WriteLine("if (p is IConvertible) return ((IConvertible)p).To{0}(null);", to.Name);
+				}
+
+				WriteLine("");
+
+				if (to.FromObjectReturn != null)
+					WriteLine(to.FromObjectReturn);
+				else
+					WriteLine("throw CreateInvalidCastException(p.GetType(), typeof({0}));", to.Name);
+
+				PopIndent();
+
+				WriteLine("}");
+			}
+
+			if (to.NonSilverlightable)
+			{
+				ClearIndent();
+				WriteLine("");
+				WriteLine("#endif");
+				PushIndent("\t\t");
+			}
+
+			WriteLine("");
+			WriteLine("#endregion");
+		}
+
+		WriteLine("");
+		WriteLine("#endregion");
+	}
+
+	ClearIndent();
+}
+#>