private void WriteGetDataTableMethod(UserDefinedTableTypeModel type)
        {
            Builder
                .WriteNewLine()
                .WriteIndentedLine("public DataTable GetDataTable()");

            WriteBlockStart();
            {
                WriteGetDataTableMethodBody(type);
            }
            WriteBlockEnd();
        }
        private void WriteConstructor(UserDefinedTableTypeModel type)
        {
            Builder
                .WriteIndentation()
                .Write("public ")
                .Write(type.TypeName.Name)
                .Write("()")
                .WriteNewLine();

            WriteBlockStart();
            {
                Builder.WriteIndentedLine("this.rows = new List<Row>();");
            }
            WriteBlockEnd();
        }
        private void WriteGetDataTableMethodBody(UserDefinedTableTypeModel type)
        {
            Builder
                .WriteIndentedLine("DataTable table = new DataTable();");

            foreach (var column in type.Columns)
            {
                Builder
                    .WriteIndentation()
                    .Write("table.Columns.Add(\"")
                    .Write(column.DatabaseName)
                    .Write("\", typeof(")
                    .Write(column.ClrType.InnerTypeName)
                    .Write("));")
                    .WriteNewLine();
            }

            Builder
                .WriteNewLine()
                .WriteIndentedLine("foreach (Row row in this.rows)");

            WriteBlockStart();
            {
                Builder.WriteIndentedLine("DataRow dataRow = table.NewRow();");

                foreach (var column in type.Columns)
                {
                    if (column.ClrType.IsNullable)
                    {
                        Builder
                            .WriteIndentation()
                            .Write("dataRow[\"")
                            .Write(column.DatabaseName)
                            .Write("\"] = row.")
                            .Write(column.PropertyName)
                            .Write(".HasValue ? (object)row.")
                            .Write(column.PropertyName)
                            .Write(".Value : DBNull.Value;")
                            .WriteNewLine();
                    }
                    else
                    {
                        Builder
                            .WriteIndentation()
                            .Write("dataRow[\"")
                            .Write(column.DatabaseName)
                            .Write("\"] = row.")
                            .Write(column.PropertyName)
                            .Write(";")
                            .WriteNewLine();
                    }
                }
                Builder.WriteIndentedLine("table.Rows.Add(dataRow);");
            }
            WriteBlockEnd();

            Builder.WriteIndentedLine("return table;");
        }
        private void WriteType(UserDefinedTableTypeModel type, bool isLast)
        {
            Builder
                .WriteIndentation()
                .Write("public partial class ")
                .Write(type.TypeName.Name)
                .WriteNewLine();

            WriteBlockStart();
            {
                WriteConstructor(type);
                WriteAddRowMethod();
                WriteGetDataTableMethod(type);
                WritePrivateMembers();
                WriteRowClass(type);
            }
            WriteBlockEnd();

            if (!isLast)
            {
                Builder.WriteNewLine();
            }
        }
 private void WriteRowClassProperties(UserDefinedTableTypeModel type)
 {
     foreach (var column in type.Columns)
     {
         Builder
             .WriteIndentation()
             .Write("public ")
             .Write(column.ClrType.TypeName)
             .Write(" ")
             .Write(column.PropertyName)
             .Write(" { get; private set; }")
             .WriteNewLine();
     }
 }
 private void WriteRowClassConstructorBody(UserDefinedTableTypeModel type)
 {
     foreach (var column in type.Columns)
     {
         Builder
             .WriteIndentation()
             .Write("this.")
             .Write(column.PropertyName)
             .Write(" = ")
             .Write(column.ParameterName)
             .Write(";")
             .WriteNewLine();
     }
 }
        private void WriteRowClassConstructorArgumentList(UserDefinedTableTypeModel type)
        {
            int lastIndex = type.Columns.Count - 1;
            for (int i = 0; i < type.Columns.Count; i++)
            {
                var column = type.Columns[i];

                Builder
                    .Write(column.ClrType.TypeName)
                    .Write(" ")
                    .Write(column.ParameterName);

                if (i != lastIndex)
                {
                    Builder.Write(", ");
                }
            }
        }
        private void WriteRowClassBody(UserDefinedTableTypeModel type)
        {
            Builder
                .WriteIndentation()
                .Write("public Row(");

            WriteRowClassConstructorArgumentList(type);

            Builder
                .Write(")")
                .WriteNewLine();

            WriteBlockStart();
            {
                WriteRowClassConstructorBody(type);
            }
            WriteBlockEnd();

            WriteRowClassProperties(type);
        }
        private void WriteRowClass(UserDefinedTableTypeModel type)
        {
            Builder
                .WriteNewLine()
                .WriteIndentedLine("public partial class Row");

            WriteBlockStart();
            {
                WriteRowClassBody(type);
            }
            WriteBlockEnd();
        }