C# 构建一个字符串,评估另一个字符串作为 template/rule/format 来执行它
C# Build a string evaluating another string as the template/rule/format to do it
我正在考虑根据用户所属的类别构建某种用户名的应用程序。当我尝试从 table 中包含的规则生成此用户名时,问题就开始了。
示例:
数据数据表
| ID | Name | City | Level | Rule |
|----|-------|--------|--------|------|
| 1 | John | London | A | 1 |
| 2 | Chris | Paris | C | 1 |
| 3 | Anna | Madrid | B | 3 |
| 4 | Marie | Roma | C | 2 |
规则数据表
| Rule | Format |
|------|-----------------------------|
| 1 | "Name + City" |
| 2 | "Name[0] + City[0] + Level" |
| 3 | "Name[0] + \".\" + City" |
我想得到的最终结果是:
| ID | Username |
|----|------------|
| 1 | JonhLondon |
| 2 | ChrisParis |
| 3 | A.Madrid |
| 4 | MRC |
所以我在想是否有一个很好的方法可以使用规则 table 中包含的字符串作为模板来构建用户名,例如:
string Name = dtData[i].Name;
string City = dtData[i].City;
string Level = dtData[i].Level;
string u = SomeGreatMethodToEvaluate(dtRules[dtData[i].Rule].Format);
dtFinal[i].Username = u;
对不起,如果我解释得不够好,但这对我来说是一件棘手的事情。
DotLiquid,这是一个模板引擎,很适合这里。使用 DotLiquid,您的规则本质上变成了模板,然后您可以将数据输入其中,从而产生所需的结果:
1. {{ name }}{{ city }}
2. {{ name | first | upcase }}{{ city | first | upcase }}{{ level }}
3. {{ name | first | upcase }}.{{ city }}
当您使用自己的规则集时,您必须自己解析它们。
但是当您使用一组标准规则时,例如 EBNF for example, then you may find something here or here.
我会尝试利用 String.Format
来做到这一点。您可以将格式字符串存储在数据库中,并以一致的方式传入参数,例如名称、城市、级别、规则。像 "Name + City"
这样的模式变得非常简单,它只需要格式字符串 "{0}{1}"
.
String.Format
不支持开箱即用 Strings
的一部分,但您可以使用 IFormatProvider
和自定义 class 来扩展其功能你的琴弦。相关问题中有很好的指示:Can maximum number of characters be defined in C# format strings like in C printf?.
我正在考虑根据用户所属的类别构建某种用户名的应用程序。当我尝试从 table 中包含的规则生成此用户名时,问题就开始了。
示例:
数据数据表
| ID | Name | City | Level | Rule |
|----|-------|--------|--------|------|
| 1 | John | London | A | 1 |
| 2 | Chris | Paris | C | 1 |
| 3 | Anna | Madrid | B | 3 |
| 4 | Marie | Roma | C | 2 |
规则数据表
| Rule | Format |
|------|-----------------------------|
| 1 | "Name + City" |
| 2 | "Name[0] + City[0] + Level" |
| 3 | "Name[0] + \".\" + City" |
我想得到的最终结果是:
| ID | Username |
|----|------------|
| 1 | JonhLondon |
| 2 | ChrisParis |
| 3 | A.Madrid |
| 4 | MRC |
所以我在想是否有一个很好的方法可以使用规则 table 中包含的字符串作为模板来构建用户名,例如:
string Name = dtData[i].Name;
string City = dtData[i].City;
string Level = dtData[i].Level;
string u = SomeGreatMethodToEvaluate(dtRules[dtData[i].Rule].Format);
dtFinal[i].Username = u;
对不起,如果我解释得不够好,但这对我来说是一件棘手的事情。
DotLiquid,这是一个模板引擎,很适合这里。使用 DotLiquid,您的规则本质上变成了模板,然后您可以将数据输入其中,从而产生所需的结果:
1. {{ name }}{{ city }}
2. {{ name | first | upcase }}{{ city | first | upcase }}{{ level }}
3. {{ name | first | upcase }}.{{ city }}
当您使用自己的规则集时,您必须自己解析它们。 但是当您使用一组标准规则时,例如 EBNF for example, then you may find something here or here.
我会尝试利用 String.Format
来做到这一点。您可以将格式字符串存储在数据库中,并以一致的方式传入参数,例如名称、城市、级别、规则。像 "Name + City"
这样的模式变得非常简单,它只需要格式字符串 "{0}{1}"
.
String.Format
不支持开箱即用 Strings
的一部分,但您可以使用 IFormatProvider
和自定义 class 来扩展其功能你的琴弦。相关问题中有很好的指示:Can maximum number of characters be defined in C# format strings like in C printf?.