public static void Deserialize(GenericPropertyCollection propertyCollection, JObject jObject)
        {
            foreach (var property in propertyCollection)
            {
                if (jObject[property.Name] != null)
                {
                    switch (property.Type)
                    {
                    case Enum.GenericPropertyType.String:
                    case Enum.GenericPropertyType.Path:
                        property.Value = JObjectHelper.GetString(jObject, property.Name);
                        break;

                    case Enum.GenericPropertyType.Integer:
                        property.Value = JObjectHelper.GetInt32(jObject, property.Name);
                        break;

                    case Enum.GenericPropertyType.Decimal:
                        property.Value = JObjectHelper.GetDouble(jObject, property.Name);
                        break;

                    case Enum.GenericPropertyType.Boolean:
                        property.Value = JObjectHelper.GetBoolean(jObject, property.Name);
                        break;

                    case Enum.GenericPropertyType.Enumeration:
                        property.Value = JObjectHelper.GetString(jObject, property.Name);
                        break;

                    case Enum.GenericPropertyType.Guid:
                        property.Value = JObjectHelper.GetGuid(jObject, property.Name);
                        break;

                    case Enum.GenericPropertyType.Color:
                        property.Value = JObjectHelper.GetColor(jObject, property.Name);
                        break;

                    case Enum.GenericPropertyType.Point:
                        var x = JObjectHelper.GetInt32(jObject, "x");
                        var y = JObjectHelper.GetInt32(jObject, "y");
                        property.Value = new Point(x, y);
                        break;

                    case Enum.GenericPropertyType.Size:
                        var width  = JObjectHelper.GetInt32(jObject, "width");
                        var height = JObjectHelper.GetInt32(jObject, "height");
                        property.Value = new Size(width, height);
                        break;

                    case Enum.GenericPropertyType.Rectangle:
                        var x_      = JObjectHelper.GetInt32(jObject, "x");
                        var y_      = JObjectHelper.GetInt32(jObject, "y");
                        var width_  = JObjectHelper.GetInt32(jObject, "width");
                        var height_ = JObjectHelper.GetInt32(jObject, "height");
                        property.Value = new Rectangle(x_, y_, width_, height_);
                        break;

                    case Enum.GenericPropertyType.DateTime:
                        var valueStr = JObjectHelper.GetString(jObject, property.Name, DateTime.UtcNow.ToString("o"));
                        property.Value = DateTime.Parse(valueStr);
                        break;

                    case Enum.GenericPropertyType.Version:
                        var versionStr = JObjectHelper.GetString(jObject, property.Name);
                        property.Value = new Version(versionStr);
                        break;

                    default:
                        break;
                    }
                }
            }
        }
        public static Dictionary <string, object> DeserializeFromJArrayToDictionary(GenericPropertyCollection propertyCollection, JArray jArray)
        {
            var result = new Dictionary <string, object>();

            foreach (var property in propertyCollection)
            {
                foreach (JObject jObjectProperty in jArray)
                {
                    var propertyName = JObjectHelper.GetString(jObjectProperty, "name");
                    if (!string.IsNullOrEmpty(propertyName) && propertyName == property.Name)
                    {
                        switch (property.Type)
                        {
                        case Enum.GenericPropertyType.String:
                        case Enum.GenericPropertyType.Path:
                            result.Add(propertyName, JObjectHelper.GetString(jObjectProperty, "value"));
                            break;

                        case Enum.GenericPropertyType.Integer:
                            result.Add(propertyName, JObjectHelper.GetInt32(jObjectProperty, "value"));
                            break;

                        case Enum.GenericPropertyType.Decimal:
                            result.Add(propertyName, JObjectHelper.GetDouble(jObjectProperty, "value"));
                            break;

                        case Enum.GenericPropertyType.Boolean:
                            result.Add(propertyName, JObjectHelper.GetBoolean(jObjectProperty, "value"));
                            break;

                        case Enum.GenericPropertyType.Enumeration:
                            result.Add(propertyName, JObjectHelper.GetString(jObjectProperty, "value"));
                            break;

                        case Enum.GenericPropertyType.Guid:
                            result.Add(propertyName, JObjectHelper.GetGuid(jObjectProperty, "value"));
                            break;

                        case Enum.GenericPropertyType.Color:
                            result.Add(propertyName, JObjectHelper.GetColor(jObjectProperty, "value"));
                            break;

                        case Enum.GenericPropertyType.Point:
                            var x = JObjectHelper.GetInt32(jObjectProperty, "x");
                            var y = JObjectHelper.GetInt32(jObjectProperty, "y");
                            result.Add(propertyName, new Point(x, y));
                            break;

                        case Enum.GenericPropertyType.Size:
                            var width  = JObjectHelper.GetInt32(jObjectProperty, "width");
                            var height = JObjectHelper.GetInt32(jObjectProperty, "height");
                            result.Add(propertyName, new Size(width, height));
                            break;

                        case Enum.GenericPropertyType.Rectangle:
                            var x_      = JObjectHelper.GetInt32(jObjectProperty, "x");
                            var y_      = JObjectHelper.GetInt32(jObjectProperty, "y");
                            var width_  = JObjectHelper.GetInt32(jObjectProperty, "width");
                            var height_ = JObjectHelper.GetInt32(jObjectProperty, "height");
                            result.Add(propertyName, new Rectangle(x_, y_, width_, height_));
                            break;

                        case Enum.GenericPropertyType.DateTime:
                            var valueStr = JObjectHelper.GetString(jObjectProperty, "value", DateTime.UtcNow.ToString("o"));
                            result.Add(propertyName, DateTime.Parse(valueStr));
                            break;

                        case Enum.GenericPropertyType.Version:
                            var versionStr = JObjectHelper.GetString(jObjectProperty, "value");
                            result.Add(propertyName, new Version(versionStr));
                            break;

                        default:
                            break;
                        }
                        break;
                    }
                }
            }

            return(result);
        }