6

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
  • Where is the code? Commented Jul 13, 2016 at 15:15

2 Answers 2

10

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.

Sign up to request clarification or add additional context in comments.

3 Comments

I think this answered to my quickly formulated question. What I would need would be too dynamic in nature where number of placeholders might be different. I think I should try to get around it different way, probably with String.Replace
@johnnyCasual If you go that route, you could of course keep the exact same placeholders you already have, and simply replace them out, eg: email = email.Replace("{o.customer}", o.customer) - that way you can keep the names the same as the variables if you wish.
Don't forget about Regex.Replace and T4 Text as well. both if these can do more powerful work in formatting a string.
-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.

2 Comments

Yeah I tried to achieve that but the problem was that I couldn't use string msg = $dbEmailString. It didn't allow $ prefix for string variable
I missed this sentence: "The idea was that the format of emails are stored in a database." The interpolated string is a compile time feature, so it is not useable in this case.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.