using System.Linq.Dynamic.Core;
public static class Program
public static void Main()
var externalKey1 = "xx/ABCDE/2";
var format1 = "http://example.com?search=`externalKey.Substring(3,5)`";
var link1 = format1.Interpolate(externalKey1, true);
Console.WriteLine(link1);
var externalKey2 = "xx/ABCDEFG/1";
var format2 = @"http://example.com?search=`(externalKey.Count(character => character == '/') > 1 ? externalKey.Substring(0,externalKey.IndexOf('/',externalKey.IndexOf('/')+1)) : externalKey).ToLower()`";
var link2 = format2.Interpolate(externalKey2, true);
Console.WriteLine(link2);
var externalKey3 = "12345678-032C-495B-8AD0-0C6DE720A39D";
var format3 = @"http://example.com?search=`Guid.Parse(externalKey).ToString(""N"")`";
var link3 = format3.Interpolate(externalKey3, true);
Console.WriteLine(link3);
private const char Separator = '`';
private static string Interpolate(this string template, string externalKey, bool displayErrors)
if (!template.Contains(Separator))
var parts = template.Split(Separator);
foreach (var index in Enumerable.Range(0, parts.Length).Where(index => index % 2 == 1))
var expression = parts[index];
var lambda = DynamicExpressionParser.ParseLambda(typeof(string), typeof(string), $"externalKey => {expression}");
var result = lambda.Compile().DynamicInvoke(externalKey)?.ToString() ?? string.Empty;
catch (Exception exception)
parts[index] = displayErrors ? $"!!!{exception.GetBaseException().Message}!!!" : externalKey;
return string.Join("", parts);