using System.Collections.Generic;
using System.Text.RegularExpressions;
public static void Main()
ExpandoString.AddVariable("test", "TEST");
var test = new ExpandoString("This is a $(test)");
public class ExpandoString
private static Regex _VariableRegex = new Regex(@"(\$\(\w+\))", RegexOptions.Compiled);
private static MatchEvaluator _Evaluator;
private static Dictionary<string, string> _Variables = new Dictionary<string, string>();
_Evaluator = new MatchEvaluator(ReplaceVariable);
public static void AddVariable(string variable, string value)
_Variables.Add(variable, value);
public static void AddOrUpdateVariable(string variable, string value)
_Variables[variable] = value;
public static string GetVariableValue(string variable)
if (_Variables.ContainsKey(variable))
return _Variables[variable];
public static string Expand(string input)
return _VariableRegex.Replace(input, _Evaluator);
private static string ReplaceVariable(Match match)
if (_Variables.TryGetValue(match.Value.Substring(2).TrimEnd(')'), out replacement))
private string _expanded;
public string Original { get; private set; }
_expanded = Expand(Original);
public ExpandoString(string original)
public static implicit operator string(ExpandoString value) => value?.Expanded;
public static implicit operator ExpandoString(string value) => new ExpandoString(value);
public override string ToString()
public override int GetHashCode()
return Expanded.GetHashCode();
public override bool Equals(object obj)
return Expanded.Equals(obj);