AScript是一个开源的C#动态脚本解析执行引擎,版本1.8.1新增了字符串模板转化功能。
我们来对比两种字符串模板方案:
方案一
比较常用的字符串模板方案,使用Replace替换变量。
尊敬的 {userName}{userSex} 您好,祝您{userAge}岁生日快乐!
转化逻辑如下:
1 // 模拟获取业务数据
2 var user = new { Name = "张三", Sex = 1, Birthday = new DateTime(1990, 10, 8), CreateTime = new DateTime(2026, 5, 1) };
3 // 计算模板中需要的变量
4 var userName = user.Name;
5 var userSex = user.Sex == 0 ? "女士" : "先生";
6 var useAge = (DateTime.Now.Year - user.Birthday.Year).ToString();
7 // 替换模板中的变量
8 var result = template.Replace("{userName}", userName).Replace("{userSex}", userSex).Replace("{userAge}", userAge);
9 // 结果:尊敬的 张三先生 您好,祝您36岁生日快乐!
方案二
动态脚本转化模板,字符串中使用${}包含脚本块。
尊敬的 ${user.Name}${user.Sex == 0 ? '女士' : '先生'} 您好,祝您${DateTime.Now.Year - user.Birthday.Year}岁生日快乐!
转化逻辑如下:
1 // 模拟获取业务数据
2 var user = new { Name = "张三", Sex = 1, Birthday = new DateTime(1990, 10, 8), CreateTime = new DateTime(2026, 5, 1) };
3 var script = new Script();
4 // 注入业务数据
5 script.Context.SetVar("user", user);
6 // 转化模板
7 var result = script.Translate(template)?.Trim();
8 // 结果:尊敬的 张三先生 您好,祝您36岁生日快乐!
两个方案对比
方案一:代码与模板中的变量名需要保持一致,变量固定,模板中新增变量需要同步代码修改;
方案二:代码只需注入业务数据即可,不关心模板如何使用,后期维护非常灵活。
高级应用
- 脚本块中定义的变量和函数不会回写到上下文;
- 当前脚本块可以调用前一个脚本块中定义的变量和函数;
${}脚本块会将最后一条语句执行结果拼接到字符串中;@{}脚本块只执行,不拼接结果,常用于变量计算或者函数定义。
@{
int calcAge(DateTime birthday) {
return DateTime.Now.Year - birthday.Year
}
var userSex = user.Sex == 0 ? '女士' : '先生';
//var userAge = DateTime.Now.Year - user.Birthday.Year;
//var userAge = calcAge(user.Birthday);
}
尊敬的 ${user.Name}${userSex} 您好,祝您${calcAge(user.Birthday)}岁生日快乐!
模板转化逻辑见 方案二。
大家在项目应用中是如何设计字符串模板的呢?
nuget安装包:install-package AScript
开源地址:
