程序員都自己寫過代碼生成器吧?說實在的,我沒用過商業化的代碼生成器,有那學習怎么使用的功夫自己也寫出來一個了。代碼生成工具用來避免一些重復勞動,還是很爽的。以前寫過好幾個,實現的都很蹩腳,主要是模板寫起來費事又難看。這次選用Razor模板試試,因為Razor模板語法相對於其他模板,更加簡潔,編寫的模板看上去更加美觀。個人認為:使用框架代替不了代碼生成,框架只是粗粒度的提升生產力,而代碼生成可以在小方面提升編碼效率。
模板編寫:
看一下我這里寫的一個代碼生成模板:
<
Grid
x:Name
="LayoutRoot"
Background
="White"
Width
="400"
>
< Grid.ColumnDefinitions >
< ColumnDefinition Width ="Auto" />
< ColumnDefinition />
</ Grid.ColumnDefinitions >
< Grid.RowDefinitions >
@foreach (Column col in Model.Columns)
{
< RowDefinition Height ="Auto" />
}
</ Grid.RowDefinitions >
@foreach (Column col in Model.Columns)
{
var desp = col.Description ?? col.Name;
< TextBlock Text ="@desp" Margin ="4" VerticalAlignment ="Center" />
< TextBox Text =" {Binding @col.Name} " Grid.Column ="1" Margin ="4" />
}
</ Grid >
< Grid.ColumnDefinitions >
< ColumnDefinition Width ="Auto" />
< ColumnDefinition />
</ Grid.ColumnDefinitions >
< Grid.RowDefinitions >
@foreach (Column col in Model.Columns)
{
< RowDefinition Height ="Auto" />
}
</ Grid.RowDefinitions >
@foreach (Column col in Model.Columns)
{
var desp = col.Description ?? col.Name;
< TextBlock Text ="@desp" Margin ="4" VerticalAlignment ="Center" />
< TextBox Text =" {Binding @col.Name} " Grid.Column ="1" Margin ="4" />
}
</ Grid >
這是一個生成前端Xaml代碼的模板,用到了循環foreach、綁定屬性及變量定義語句,但是模板看上去一點都不亂。如果用webform的<%%>語法,將會慘不忍睹。
智能感知:
模板的編寫完全可以做到智能感知的,只要我們在VS里新建一個文本文件,把擴展名改為cshtml,重新打開,@using用到的命名空間,然后把Model定義為強類型就OK了。當然了,寫完以后別忘了刪除定義語句。畢竟模板的編寫大多數是一次性的,生產力的提高也體現在這里。
模板解析:
借助RazorEngine解析模板,異常簡單,項目地址 http://razorengine.codeplex.com/。只需引用2個dll,然后調用如下語句:
string result = Razor.Parse(template, model);
第一個參數是我們上面寫的模板的字符串形式,第二個參數是數據上下文,返回值就是生成的代碼了。
結論:
借助Razor模板寫一個簡單的自用型代碼生成器,變成了一件簡單有趣的事情。
