private SharpObject ApplyMap(SharpObject map, SharpObject record, SharpObject context) { var obj = new SharpObject(); foreach (var item in map) { if (item.Value is SharpObject) { obj[item.Key] = ApplyMap((SharpObject)item.Value, record, context); } else if (item.Value is SharpObjectList) { foreach (var child in (SharpObjectList)item.Value) { obj.Add(item.Key, ApplyMap(child, record, context)); } } else { if (item.Value is string) { object fieldValue = record.Format((string)item.Value); string stringValue = fieldValue.ToString(); if (SharpObject.IsFormatRequired(stringValue)) { fieldValue = obj.Format(stringValue); stringValue = fieldValue.ToString(); } if (SharpObject.IsFormatRequired(stringValue)) { fieldValue = null; stringValue = ""; } var fieldName = item.Key; var fieldParts = fieldName.Split('_'); if (fieldParts.Length == 2) { var fieldType = fieldParts[1].ToLower(); switch (fieldType) { case "bool": fieldName = fieldParts[0]; if (string.IsNullOrEmpty(stringValue)) { fieldValue = false; } else if (stringValue == "0" || stringValue == "1") { fieldValue = stringValue == "1"; } else if (stringValue.StartsWith("y", StringComparison.OrdinalIgnoreCase) || stringValue.StartsWith("n", StringComparison.OrdinalIgnoreCase)) { fieldValue = stringValue.StartsWith("y", StringComparison.OrdinalIgnoreCase); } else { fieldValue = Convert.ToBoolean(stringValue); } break; case "int": fieldName = fieldParts[0]; fieldValue = Convert.ToInt32(stringValue); break; case "long": fieldName = fieldParts[0]; fieldValue = Convert.ToInt64(stringValue); break; case "datetime": fieldName = fieldParts[0]; fieldValue = Convert.ToDateTime(stringValue); break; case "decimal": fieldName = fieldParts[0]; fieldValue = Convert.ToDecimal(stringValue); break; case "list": fieldName = fieldParts[0]; fieldValue = EncodedString.ParseList(stringValue); break; } } obj[fieldName] = fieldValue; } else { obj[item.Key] = item.Value; } } } return(obj); }