[英]Interpolating a string stored in a database
我們希望維護從ASP.NET Web應用程序發送到數據庫中的電子郵件。 想法是電子郵件的格式存儲在數據庫中。
問題是電子郵件應包含訂單特定信息,例如:
感謝您的訂單John Smith,
您的訂單已收到1234
我想要實現的是我在數據庫列值中使用了字符串verbatims,它將像這樣存儲:
感謝您的訂單{o.customer},
您的訂單已收到{o.id}
我很好奇是否可以進行字符串插值,其中值已經在格式化的字符串中。 如果我嘗試使用String.Format(dbEmailString)
它會拋出異常:
mscorlib.dll中出現“System.FormatException”類型的異常,但未在用戶代碼中處理
附加信息:輸入字符串的格式不正確。
字符串插值是一種編譯時功能。 您可以使用常規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的新功能: 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";`
它可能有用,我沒有線索。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.