public void SetDataType(string propertyName, RestFieldDataType dataType)
 {
     if (_dataTypes == null)
     {
         _dataTypes = new Dictionary <string, RestFieldDataType>();
     }
     _dataTypes[propertyName] = dataType;
 }
        // Used as data accessor for _additionalData elements
        public object this[string propertyName]
        {
            get
            {
                if (_additionalData == null || !_additionalData.ContainsKey(propertyName))
                {
                    return(null);
                }
                RestFieldDataType type = RestFieldDataType.OBJECT;
                if (_dataTypes != null && _dataTypes.ContainsKey(propertyName))
                {
                    type = _dataTypes[propertyName];
                }
                object baseObject = _additionalData[propertyName];
                switch (type)
                {
                case RestFieldDataType.GRID:
                    if (baseObject is GridField)
                    {
                        return(baseObject);
                    }
                    if (baseObject is JObject)
                    {
                        return((baseObject as JObject).ToObject <GridField>());
                    }
                    return(null);

                case RestFieldDataType.OBJECT:
                    return(baseObject);

                case RestFieldDataType.INTEGER:
                    if (baseObject is int)
                    {
                        return(baseObject);
                    }
                    return(Convert.ToInt32(baseObject.ToString()));

                case RestFieldDataType.DATE:
                    return(dbString2DateTime(baseObject.ToString()));

                case RestFieldDataType.STRING:
                    return(baseObject.ToString());

                case RestFieldDataType.BOOLEAN:
                    if (baseObject is bool)
                    {
                        return(baseObject);
                    }
                    if (baseObject is int)
                    {
                        return((baseObject as int?) == 1);
                    }
                    return(baseObject.ToString().Trim().Equals("1"));
                }
                return(null);
            }
            set
            {
                if (_additionalData == null)
                {
                    _additionalData = new Dictionary <string, object>();
                }
                if (value == null)
                {
                    _additionalData.Remove(propertyName);
                    return;
                }
                object baseObject = value;
                if (_dataTypes != null && _dataTypes.ContainsKey(propertyName))
                {
                    switch (_dataTypes[propertyName])
                    {
                    case RestFieldDataType.GRID:
                        if (baseObject is JObject)
                        {
                            baseObject = (baseObject as JObject).ToObject <GridField>();
                        }
                        if (!(baseObject is GridField))
                        {
                            baseObject = null;
                        }
                        break;

                    case RestFieldDataType.DATE:
                        if (baseObject is DateTime)
                        {
                            baseObject = dateTime2DbString((DateTime)baseObject);
                        }
                        else
                        {
                            baseObject = "";
                        }
                        break;

                    case RestFieldDataType.INTEGER:
                    case RestFieldDataType.STRING:
                        baseObject = baseObject.ToString();
                        break;

                    case RestFieldDataType.BOOLEAN:
                        if (baseObject is bool && (baseObject as bool?) == true)
                        {
                            baseObject = "1";
                        }
                        else
                        {
                            baseObject = "0";
                        }
                        break;
                    }
                }
                _additionalData[propertyName] = baseObject;
            }
        }