Interpolating a string stored in a database

放肆的年华 提交于 2019-12-10 15:27:27

问题


We would like to maintain the emails that are sent from our ASP.NET Web Application in a database. The idea was that the format of emails are stored in a database.

The problem is that emails should include order specific information, e.g.:

Thank you for your order John Smith,

your order 1234 has been received

What I'm trying to achieve is that I have used string verbatims in the database column values where it would be stored like this:

Thank you for your order {o.customer},

your order {o.id} has been received

I'm curious as to whether it is possible to do string interpolation where the values are already in the string that is formatted. If I try to use String.Format(dbEmailString) it throws me exception:

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.


回答1:


String interpolation is a compile time feature. You can do what you want using the regular String.Format:

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

If you've got a requirement to replace out various different placeholders with the values, perhaps you need to be looking for a more dynamic templating system, a very basic one could be done with String.Replace.

The bottom line is you can't reference variables in your code directly from stored strings in this fashion - you'll need to process the string in some way at runtime.




回答2:


In c# 6, the interpolated string expression looks like a template string that contains expressions. It looks like the String.Format() placeholders, but instead of an index, it is the expression itself inside the curly braces.
it looks like String.Format() in C#6 is a syntactical sugar that the compiler treats like String.Format() behind the scenes.

example, to display the expressions in OP in vs 2015:

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);

    }

}

The output is:

Thank you for your order Robert

your order 123 has been received

You can retrieve the formatted expressions from the database and prefix them with "$", as described in the example above.

Under VS 2013 you can install the new compilers into the project as a nuget package: Install-Package Microsoft.Net.Compilers




回答3:


I think you mean the new feature of C# 6.0: https://msdn.microsoft.com/en-us/library/dn961160.aspx

I only read about it and have no experience yet. But it must work with customer and id variables and I have no sign wether it works or not with an object's properties.

string customer = o.customer; int id = o.id; string msg = $"Thank you for your order {customer},your order {id} has been received";

gives you the correct result. (VS 2015 and .Net 4.6 provided.)

string msg = $"Thank you for your order {o.customer}, your order {o.id} has been received";`

It may work, I have no clues.



来源:https://stackoverflow.com/questions/38355578/interpolating-a-string-stored-in-a-database

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!