插入存储在数据库中的字符串
Interpolating a string stored in a database
我们想在数据库中维护从我们的 ASP.NET Web 应用程序发送的电子邮件。这个想法是将电子邮件的格式存储在数据库中。
问题是电子邮件应包含订单特定信息,例如:
Thank you for your order John Smith,
your order 1234 has been received
我想要实现的是,我在数据库列值中使用了字符串逐字记录,它将像这样存储:
Thank you for your order {o.customer},
your order {o.id} has been received
我很好奇是否可以在值已经在格式化的字符串中的情况下进行字符串插值。如果我尝试使用 String.Format(dbEmailString)
它会抛出异常:
An exception of type 'System.FormatException' occurred in mscorlib.dll
but was not handled in user code
Additional information: Input string was not in a correct format.
字符串插值是一个编译时特性。您可以使用常规 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.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";`
可能有用,我没有线索。
在 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 包安装到项目中:
安装包 Microsoft.Net.Compilers
我们想在数据库中维护从我们的 ASP.NET Web 应用程序发送的电子邮件。这个想法是将电子邮件的格式存储在数据库中。
问题是电子邮件应包含订单特定信息,例如:
Thank you for your order John Smith,
your order 1234 has been received
我想要实现的是,我在数据库列值中使用了字符串逐字记录,它将像这样存储:
Thank you for your order {o.customer},
your order {o.id} has been received
我很好奇是否可以在值已经在格式化的字符串中的情况下进行字符串插值。如果我尝试使用 String.Format(dbEmailString)
它会抛出异常:
An exception of type 'System.FormatException' occurred in mscorlib.dll but was not handled in user code
Additional information: Input string was not in a correct format.
字符串插值是一个编译时特性。您可以使用常规 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.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";`
可能有用,我没有线索。
在 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 包安装到项目中: 安装包 Microsoft.Net.Compilers