6

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

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

感谢您订购约翰史密斯,

您的订单 1234 已收到

我想要实现的是,我在数据库列值中使用了字符串逐字记录,它将像这样存储:

感谢您订购 {o.customer},

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

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

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

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

4

3 回答 3

9

字符串插值是一个编译时特性。您可以使用常规做您想做的事情String.Format

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

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

最重要的是,您不能以这种方式直接从存储的字符串中引用代码中的变量——您需要在运行时以某种方式处理字符串。

于 2016-07-13T15:16:37.533 回答
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);

    }

}

输出是:

感谢您订购罗伯特

您的订单 123 已收到

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

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

于 2016-07-13T18:03:24.657 回答
-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";`

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

于 2016-07-13T15:47:35.817 回答