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

时间:2016-07-13 15:12:49

标签: c# string string-interpolation verbatim-string

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

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

  

感谢您订购John Smith,

     

您的订单已收到1234

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

  

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

     

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

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

  

mscorlib.dll中发生了'System.FormatException'类型的异常   但未在用户代码中处理

     

其他信息:输入字符串的格式不正确。

3 个答案:

答案 0 :(得分:7)

字符串插值是一种编译时功能。您可以使用常规var formattedEmail = String.Format("Thank you for your order {0}, your order {1} has been received", o.customer, o.id);

执行您想要的操作
String.Replace

如果您需要使用这些值替换各种不同的占位符,也许您需要寻找更加动态的模板系统,可以使用 foreach (var element in list) { if (!element.IsPicked) { foreach(var grandChild in element) { foreach(var greatGrandChild in grandChild) { greatGrandChild.GetComponent<Image>().enabled = false; } } } } 完成一个非常基本的模板系统。 / p>

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

答案 1 :(得分: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);

    }

}

输出结果为:

感谢您的订单Robert

您的订单已收到

您可以从数据库中检索格式化的表达式,并使用&#34; $&#34;作为前缀,如上例所示。

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

答案 2 :(得分:-1)

我认为你的意思是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";`

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