public void SetProperty <T>(string name, T value)
        {
            var p = PropertiesMetadata.FirstOrDefault(v => v.Name == name);

            if (p != null)
            {
                // Type should match
                if (p.Type != value.GetType())
                {
                    throw new InvalidCastException();
                }
            }
            else
            {
                if (AllowDynamicProperties)
                {
                    p = new DynamicPropertyMetadata(name, value.GetType());
                    p.SaveTypeInfo = true;
                    PropertiesMetadata.Add(p);
                }
                else
                {
                    throw new InvalidPropertyException();
                }
            }

            Dictionary[name] = value;
            RaisePropertyChanged(name);
        }
        public void Load(string xml)
        {
            var root = XElement.Parse("<a>" + xml + "</a>");

            Dictionary.Clear();

            var b = new StringBuilder();

            foreach (var element in root.Elements())
            {
                Type type = null;

                var typeAttribute = element.Attribute("t");
                if (typeAttribute != null)
                {
                    type = GetType(typeAttribute.Value);
                }
                else
                {
                    var dynamicPropertyMetadata =
                        PropertiesMetadata.FirstOrDefault(x => x.Name == element.Name.LocalName);
                    if (dynamicPropertyMetadata == null)
                    {
                        throw new InvalidPropertyException();
                    }
                    type = dynamicPropertyMetadata.Type;
                }

                var s = new DataContractSerializer(type);

                using (var reader = ShouldWriteContent(type)
                                        ? element.CreateReader()
                                        : element.Elements().Single().CreateReader())
                {
                    var obj = s.ReadObject(reader, false);
                    SetProperty(element.Name.LocalName, obj);
                }
            }

            RefreshProxy();
        }
        public T GetProperty <T>(string name)
        {
            object value;

            if (Dictionary.TryGetValue(name, out value))
            {
                return((T)value);
            }

            var p = PropertiesMetadata.FirstOrDefault(v => v.Name == name);

            if (p != null)
            {
                return((T)(p.Type.IsValueType ? Activator.CreateInstance(p.Type) : null));
            }
            if (AllowDynamicProperties)
            {
                return(default(T));
            }

            throw new InvalidPropertyException();
        }