我们希望维护从ASP.NET Web应用程序发送到数据库中的电子邮件。这个想法是电子邮件的格式存储在数据库中。
问题是电子邮件应包含订单特定信息,例如:
感谢您订购John Smith,
您的订单已收到1234
我想要实现的是我在数据库列值中使用了字符串verbatims,它将像这样存储:
感谢您的订单{o.customer},
已收到您的订单{o.id}
我很好奇是否可以进行字符串插值,其值已经在格式化的字符串中。如果我尝试使用String.Format(dbEmailString)
,它会抛出异常:
mscorlib.dll中发生了'System.FormatException'类型的异常 但未在用户代码中处理
其他信息:输入字符串的格式不正确。
答案 0 :(得分:7)
字符串插值是一种编译时功能。您可以使用常规var formattedEmail = String.Format("Thank you for your order {0}, your order {1} has been received", o.customer, o.id);
:
String.Replace
如果您需要使用这些值替换各种不同的占位符,也许您需要寻找更加动态的模板系统,可以使用 foreach (var element in list)
{
if (!element.IsPicked)
{
foreach(var grandChild in element)
{
foreach(var greatGrandChild in grandChild)
{
greatGrandChild.GetComponent<Image>().enabled = false;
}
}
}
}
完成一个非常基本的模板系统。 / p>
最重要的是,您不能以这种方式直接从存储的字符串中引用代码中的变量 - 您需要在运行时以某种方式处理字符串。
答案 1 :(得分:0)
在c#6中,插值字符串表达式看起来像包含表达式的模板字符串。
它看起来像String.Format()占位符,但它不是索引,而是花括号内的表达式。
它看起来像C#6中的String.Format()是一个语法糖,编译器在后台处理像String.Format()。
示例,在vs 2015中显示OP中的表达式:
class Program
{
static void Main(string[] args)
{
dynamic order = new {customer = "Robert", id=123};
PrintString(order);
}
static void PrintString(dynamic o)
{
var exp1 = $"Thank you for your order { o.customer}";
var exp2 = $"your order { o.id} has been received";
Console.WriteLine(exp1);
Console.WriteLine(exp2);
}
}
输出结果为:
感谢您的订单Robert
您的订单已收到
您可以从数据库中检索格式化的表达式,并使用&#34; $&#34;作为前缀,如上例所示。
在VS 2013下,您可以将新编译器作为nuget包安装到项目中: 安装包Microsoft.Net.Compilers
答案 2 :(得分:-1)
我认为你的意思是C#6.0的新功能:https://msdn.microsoft.com/en-us/library/dn961160.aspx
我只读过它并且还没有经验。但它必须与customer
和id
变量一起使用,并且我没有任何迹象表明它是否适用于对象的属性。
string customer = o.customer;
int id = o.id;
string msg = $"Thank you for your order {customer},your order {id} has been received";
为您提供正确的结果。 (VS 2015和.Net 4.6提供。)
string msg = $"Thank you for your order {o.customer}, your order {o.id} has been received";`
它可能有用,我没有线索。