变量扩展
一、定义扩展类
在 profile 目录下,添加类文件,编写代码(示例使用 C# 编写)如下:
using System.ComponentModel;
using CodeBuilder.Core;
public class ProfileExt1
{
[Description("使用 FluentApi 进行实体映射。")]
public bool Fluent { get; set; }
[Description("模块名。")]
[UnPersistently]
public string Module { get; set; }
[Description("子命名空间。用于指定默认命名空间之后的子目录,可以使用.来无限扩展,如 Customer.OrderHistory。")]
[UnPersistently]
public string SubNameSpace { get; set; }
}
属性上可使用以下特性进行标注:
DescriptionAttribute
在属性上进行标注,可在【属性窗口】里看到此注释。
DefaultValueAttribute
默认值,在【属性窗口】中默认填入。如:
[DefaultAttribute(true)]
public bool Fluent { get; set; }
CategoryAttribute
对变量进行分组。如:
[CategoryAttribute("项目")]
public string ProjectName { get; set; }
DisplayNameAttribute
标注在【属性窗口】里显示的名称。
RequiredCheckAttribute
表示此项为必填,在生成代码前会被检测。
UnPersistentlyAttribute
表示此属性不会被持久化,变量的值不会保存到文件,每次加载后均为空值或默认值。
💡 多说一句
注意类文件里要引入 System.ComponentModel
命名空间。RequiredCheckAttribute
和 UnPersistentlyAttribute
需要引用 CodeBuilder.Core
命名空间。
二、变量初始化
实现变量初始化器 IProfileInitializer
可以对变量进行赋值。此接口的定义如下:
namespace CodeBuilder.Core.Initializers
{
/// <summary>
/// 提供对变量进行初始化的接口。
/// </summary>
public interface IProfileInitializer
{
void Initialize(dynamic profile, TemplateDefinition template);
}
}
比如根据模板定义来设置变量中的语言:
public class LanguageInitializer : IProfileInitializer
{
public void Initialize(dynamic profile, TemplateDefinition template)
{
if (template == null)
{
return;
}
if (template.Language == "CSharp")
{
profile.Language = Language.CSharp;
}
else if (template.Language == "Java")
{
profile.Language = Language.Java;
}
else if (template.Language == "VB")
{
profile.Language = Language.VB;
}
else
{
profile.Language = Language.None;
}
}
}
由于 profile 是 dynamic
类型,因此必须保证你所使用的属性是在扩展类里被定义过的。
TemplateDefinition
类的定义详见 模板定义 - 附。
💡 多说一句
可以在配置文件 configassemblies.cfg
的 Profile 属性里增加程序集。