public static T ToDynamicContent <T>(this WidgetDynamicContent content) where T : IWidgetDynamicContent
        {
            string key = typeof(T).FullName;

            var properties = _cache.GetOrAdd(key, (_) =>
            {
                return(typeof(T).GetProperties().Where(t => t.CanWrite && t.CanRead).ToArray());
            });

            var instance = Activator.CreateInstance <T>();

            instance.Id       = content.Id;
            instance.UserId   = content.UserId;
            instance.WidgetId = content.WidgetId;

            foreach (var item in properties)
            {
                var name = item.Name;
                if (name == "Id" || name == "UserId" || name == "WidgetId")
                {
                    continue;
                }

                var valueString = content.Properties?.FirstOrDefault(t => t.Name == name)?.Value;

                if (string.IsNullOrEmpty(valueString))
                {
                    continue;
                }

                if (!TypeDescriptor.GetConverter(item.PropertyType).CanConvertFrom(typeof(string)))
                {
                    continue;
                }
                if (!TypeDescriptor.GetConverter(item.PropertyType).IsValid(valueString))
                {
                    continue;
                }

                object value = TypeDescriptor.GetConverter(item.PropertyType).ConvertFromInvariantString(valueString);

                item.SetValue(instance, value);
            }

            return(instance);
        }
        public static WidgetDynamicContent ToContent(this IWidgetDynamicContent instance)
        {
            string key = instance.GetType().FullName;

            var properties = _cache.GetOrAdd(key, (_) =>
            {
                return(instance.GetType().GetProperties().Where(t => t.CanWrite && t.CanRead).ToArray());
            });

            var entity = new WidgetDynamicContent()
            {
                Id       = instance.Id,
                UserId   = instance.UserId,
                WidgetId = instance.WidgetId,
            };


            foreach (var item in properties)
            {
                var name = item.Name;
                if (name == "Id" || name == "UserId" || name == "WidgetId")
                {
                    continue;
                }

                var value = item.GetValue(instance);

                if (value == null)
                {
                    continue;
                }

                entity.Properties.Add(new WidgetDynamicContentProperty()
                {
                    Name      = name,
                    Value     = value.ToString(),
                    ValueType = item.PropertyType.Name,
                });
            }

            return(entity);
        }