On machines where I don't have C# 6 I use this named string interpolation method. I tried to make it as pretty a possible as far as good coding practices are concerned but I just can't get rid of the repeating code for braces validation and index incrementation. Somehow I don't like it.
public static string FormatFrom(this string text, object args, bool ignoreCase = true)
{
var substrings = Regex.Split(text, "({{?)([A-Za-z_][A-Za-z0-9_]+)(}}?)");
var argsType = args.GetType();
var result = new StringBuilder(text.Length);
const int leftBraceOffset = 0;
const int propertyNameOffset = 1;
const int rightBraceOffset = 2;
for (int i = 0; i < substrings.Length; i++)
{
var leftBraceIndex = i + leftBraceOffset;
var propertyNameIndex = i + propertyNameOffset;
var rightBraceIndex = i + rightBraceOffset;
var isPropertyName = substrings[leftBraceIndex] == "{" && substrings[rightBraceIndex] == "}";
if (isPropertyName)
{
var propertyName = substrings[propertyNameIndex];
var property = argsType.GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public);
result.Append(property.GetValue(args));
i += 2;
continue;
}
var isEscapedPropertyName = substrings[leftBraceIndex] == "{{" && substrings[rightBraceIndex] == "}}";
if (isEscapedPropertyName)
{
result.Append("{").Append(substrings[propertyNameIndex]).Append("}");
i += 2;
continue;
}
result.Append(substrings[i]);
}
return result.ToString();
}
var text = "Lorem {ipsum} {dolor} {{sit}} met.";
var obj = new { ipsum = "abc", dolor = 2.1 };
var text2 = text.FormatFrom(obj);
Result:
Lorem abc 2.1 {sit} met.
IFormattable
interface. Jon Skeet did a great demo of it on you tube. \$\endgroup\$