System.Net void Main() { string pattern = @"\{([A-Za-z]+)\}"; Regex rgx = new Regex(pattern); string source = @"/_matrix/client/r0/user/{userId}/rooms/{roomId}/account_data/{type}"; MatrixApiEntities entities = new MatrixApiEntities() { UserId = "claire", RoomId = "boobs", Type = "private", Tags = "dummy" }; foreach (Match match in rgx.Matches(source)) { string replace = match.Value; string prop = UpperFirst(match.Groups[1].Value); // check if property exists in entity list try { // get value of property through GetType().GetProperty().GetValue() string entityValue = entities.GetType().GetProperty(prop).GetValue(entities).ToString(); // return URL with entities replaced and URL-encoded source = WebUtility.UrlEncode(source.Replace(replace,entityValue)); } catch { // shit broke } } Console.WriteLine(source); } public string UpperFirst(string s) { // Check for empty string. if (string.IsNullOrEmpty(s)) { return string.Empty; } // Return char and concat substring. return char.ToUpper(s[0]) + s.Substring(1); } // Define other methods and classes here public class MatrixApiEntities { public string DeviceId { get; set; } public string EventId { get; set; } public string EventType { get; set; } public string FileName { get; set; } public string FilterId { get; set; } public string Kind { get; set; } public string MediaId { get; set; } public string NetworkId { get; set; } public string ReceiptType { get; set; } public string RoomAlias { get; set; } public string RoomId { get; set; } public string RoomIdOrAlias { get; set; } public string RuleId { get; set; } public string Scope { get; set; } public string ServerName { get; set; } public string StateKey { get; set; } public string Tags { get; set; } public string TxnId { get; set; } public string Type { get; set; } public string UserId { get; set; } }