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); }
public static object ToValue(string value, SharpValueType type, bool autoType = false) { if (value == null) { return(null); } switch (type) { case SharpValueType.None: if (autoType) { return(ToValue(value, SharpValueType.Auto)); } return(value); case SharpValueType.String: return(value); case SharpValueType.Bool: { bool boolResult; if (bool.TryParse(value, out boolResult)) { return(boolResult); } return(value); } case SharpValueType.Int: { int intResult; if (int.TryParse(value, out intResult)) { return(intResult); } return(value); } case SharpValueType.Long: { long longResult; if (long.TryParse(value, out longResult)) { return(longResult); } return(value); } case SharpValueType.Date: case SharpValueType.DateTime: case SharpValueType.TimeStamp: { DateTime dateResult; if (DateTime.TryParse(value, out dateResult)) { return(dateResult); } return(value); } case SharpValueType.TimeSpan: { TimeSpan timeSpanResult; if (TimeSpan.TryParse(value, out timeSpanResult)) { return(timeSpanResult); } return(value); } case SharpValueType.Double: { double doubleResult; if (double.TryParse(value, out doubleResult)) { return(doubleResult); } return(value); } case SharpValueType.Decimal: { Decimal decimalResult; if (Decimal.TryParse(value, out decimalResult)) { return(decimalResult); } return(value); } case SharpValueType.NumericString: { if (NumericString.CanEncode(value)) { return(new NumericString(value)); } return(value); } case SharpValueType.List: { return(EncodedString.ParseList(value, trimStrings: true)); } case SharpValueType.Object: { return(EncodedString.ParseObject(value)); } } return(value); }