zoukankan      html  css  js  c++  java
  • CodeSmith : 声明和使用属性

    CodeSmith的核心是模板,而使模板具有活力的就是属性,通过定义属性从而使代码模板能够根据配置生成所需的代码。在使用代码模板时首先也必须给模板定义的属性定义值才能使用CodeSmith通过模板产生代码。有些属性具有缺省值,这些属性可以不需要配置。

    模板中的属性通过Property指令来定义:

    <%@ Property Name="NameSpace" Type="String" Category="01.命名空间" Description="项目的命名空间" %>

    属性参数的介绍:

    • Name:模版使用的参数的名称。
    • Type:参数类型可以是任何.NET有效的数据类型,例如简单的String类型或者是CodeSmith的SchemaExplorer.DatabaseSchema类型。注意,类型必须是基类库的类型,例如用String或者Int32代替string和int。
    • Default:设置默认值。
    • Category:用来说明这个属性在CodeSmith Explorer的属性面板中显示成什么类型,例如下拉选择、直接输入等。
    • Description:在属性面板中对于这个属性的描述。
    • Optional:设置这个属性是否是必须的,设置为True表明这个参数值可有可无,设置为False则这个参数必须有值。
    • Editor:表明在属性面板中输入这个属性的值时使用何种GUI(图形界面编辑器)编辑器。
    • EditorBase:编辑器使用的基本类型,如果没有被说明,UITypeEditor为默认编辑器。
    • Serializer 定义用于属性的IPropertySerializer类型。
    • OnChanged 为属性发生变化时定义事件处理代码。
    • DeepLoad 只用在SchemaExplorer对象,当为True,SchemaExplorer一次性取得有关数据库Schema的所有信息而避免多次查询数据库。

    在配置属性时,每个属性根据其类型和Editor不同而使用不同的配置界面,对应一些简单的类型,比如Int,String可以直接编辑,而对于数据库类型可以使用Schema Explorer,CodeSmith预先定义了一些属性编辑器,此外也可以通过自定义为某些特殊的属性类型定义新的属性编辑器,这在后面再介绍。通常情况下无需自定义。

    在某些情况下,如果所定义的属性值为一个列表中的某个值,比如在CodeSmith自带的模板 SortedList.cst 中定义了一个属性用来为所生成的类设置可见性:

    20130105001

    这可以通过定义一个枚举类型来实现:

    	public enum AccessibilityEnum
    	{
    		Public,
    		Protected,
    		Internal,
    		ProtectedInternal,
    		Private
    	}
    然后为所定义的属性的类型定义为这个枚举类型:

    <%@ Property Name="Accessibility" Type="AccessibilityEnum" Default="Public" Category="1. Class Definition"  %>

    由于属性可以定义为可选(Optional),因此在模板中需要检测某个的属性是否配置过,比如下面定义了一个属性为Optional

    <%@ Property Name="DataBaseName" Optional="True" Type="System.String" Category="05.生成配置" Description="SQLUnit中的数据库名字,如果为空,则使用默认" %>

    在模板中脚本需要检测这个属性是否有值可以通过下面代码来实现:

                <%if(string.IsNullOrWhiteSpace(DataBaseName)){ %>
                //
                <%}else{ %>
                //
                <%} %>

    从上面也可以看出,在脚本中使用属性直接使用属性名字即可,无需加前缀(比如$之类的前缀)。

    OnChange用法举例:

    <%@ Property Name="SourceDatabase" Type="SchemaExplorer.DatabaseSchema" Category="Required" Description="Database that the stored procedures wrappers should be based on." OnChanged="OnSourceDatabaseChanged" DeepLoad="True" IncludeFunctions="True" %>
    
            public void OnSourceDatabaseChanged(object sender, System.EventArgs args)
            {
                if (SourceDatabase == null) return;
                SourceDatabase.IncludeFunctions = IncludeFunctions;
    
                if (string.IsNullOrEmpty(TargetNamespace))
                {
                    TargetNamespace = SourceDatabase.Name;
                }
    
                if (IgnoreExpressions == null)
                    IgnoreExpressions = new StringCollection();
    
                if (IgnoreExpressions.Count == 0)
                {
                    IgnoreExpressions.Add("^dbo.aspnet");
                    IgnoreExpressions.Add("^dbo.vw_aspnet");
                }
            }
    

  • 相关阅读:
    CSS—BFC学习
    JS函数声明及函数表达式相关
    你想要的正则表达式笔记
    WordPress搭建自己的网站
    声纹识别
    WordPress搭建自己的网站
    L--jsp和servlet
    L--网页跳转
    L1--指针
    L--Java关键字final、static
  • 原文地址:https://www.cnblogs.com/ful1021/p/4804432.html
Copyright © 2011-2022 走看看