我需要在Placeholders
中替换C#
电子邮件。占位符的模式如下: -
|
之后的 Table Name
用于标识从哪个数据库表中提取数据。
Hi [NAME|MAIN],
Your Address is : [ADDRESS|MAIN]
Your Code & PAN :-
[CODE|SUB]
[PAN|SUB]
以上代码存储在string
中。我想将一个MAIN类别的占位符存储在一个数组&不同数组中的SUB类别,以便我可以用实际值替换它们。
如何提取此占位符&将它们存储在Array或List中?
答案 0 :(得分:2)
显然你可以用Regex做到这一点:
var str =
@"Hi [NAME|MAIN],
Your Address is : [ADDRESS|MAIN]
Your Code & PAN :-
[CODE|SUB]
[PAN|SUB]
";
var matches = Regex.Matches(str, @"\[\w*\|\w*\]");
foreach (var m in matches)
{
Console.WriteLine(m);
}
但是,我强烈建议您重新考虑这种方法。而不是允许您的电子邮件模板指定将引用哪些数据库字段,而是从数据库中获取适当的对象并使用SmartFormat.NET之类的内容。
通过这种方法,我已经可以看到很有可能发生的两个大问题:
维护问题 - 如果重命名任何表或列,您认为开发人员会记得他应该检查电子邮件模板并更改引用该字段的模板吗?
可能存在安全问题 - 显然你可以包含这个......但你直接从数据库中提取数据这一事实并不能防止像[PASSWORD | MAIN]这样的情况。
答案 1 :(得分:0)
我同意 kape123 的评论,您需要重新考虑解决方案设计。
我建议您使用C#提供的T4模板功能,它可以帮助您生成可以作为字符串导出的html页面。
您可以创建这样的模板
<html><body>
The date and time now is: <#= DateTime.Now #>
</body></html>
同样,您可以在模板文件中设计电子邮件,并将课程内容输入到该文件中。它将根据课程中可用的值自动生成所需格式的电子邮件文本。
<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ output extension=".cs" #>
<# var properties = new string [] {"P1", "P2", "P3"}; #>
// This is generated code:
class MyGeneratedClass {
<# // This code runs in the text template:
foreach (string propertyName in properties)
{ #>
// Generated code:
private int <#= propertyName #> = 0;
<# } #>
}
上面的模板会生成一个新的类,如下面的
class MyGeneratedClass {
private int P1 = 0;
private int P2 = 0;
private int P3 = 0;
}
请参阅this.
有更多信息,请here.