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?.