插值存储在数据库中的字符串

我们希望维护从ASP.NET Web应用程序发送到数据库中的电子邮件。 想法是电子邮件的格式存储在数据库中。

问题是电子邮件应包含订单特定信息,例如:

感谢您的订单John Smith,

您的订单已收到1234

我想要实现的是我在数据库列值中使用了字符串verbatims,它将被存储在这里:

感谢您的订单{o.customer},

您的订单已收到{o.id}

我很好奇是否可以进行字符串插值,其值已经在格式化的字符串中。 如果我尝试使用String.Format(dbEmailString)它会抛出exception:

mscorlib.dll中出现“System.FormatException”类型的exception,但未在用户代码中处理

附加信息:输入字符串格式不正确。

字符串插值是一种编译时function。 您可以使用常规String.Format执行您想要的操作:

 var formattedEmail = String.Format("Thank you for your order {0}, your order {1} has been received", o.customer, o.id); 

如果您需要用值替换各种不同的占位符,也许您需要寻找更加动态的模板系统,可以使用String.Replace完成一个非常基本的模板系统。

底线是你不能以这种方式直接从存储的字符串中引用代码中的变量 – 你需要在运行时以某种方式处理字符串。

在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); } } 

输出是:

谢谢你的订单罗伯特

您的订单已收到123

您可以从数据库中检索格式化的表达式,并在前面添加“$”,如上例所示。

在VS 2013下,您可以将新编译器作为nuget包安装到项目中:Install-Package Microsoft.Net.Compilers

我认为你的意思是C#6.0的新function: https : //msdn.microsoft.com/en-us/library/dn961160.aspx

我只读过它并且还没有经验。 但它必须与customerid变量一起使用,并且我没有任何迹象表明它是否与对象的属性有效。

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";` 

它可能有效,我没有线索。