簡體   English   中英

插值存儲在數據庫中的字符串

[英]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

我只讀過它並且還沒有經驗。 但它必須與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";`

它可能有用,我沒有線索。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM