public object GetPropertyValue(IDictionaryAdapter dictionaryAdapter,
                                       string key, object storedValue, PropertyDescriptor property, bool ifExists)
        {
            if (storedValue == null || storedValue.Equals(UnassignedGuid))
            {
                storedValue = Guid.NewGuid();
                property.SetPropertyValue(dictionaryAdapter, key, ref storedValue, dictionaryAdapter.This.Descriptor);
            }

            return(storedValue);
        }
        public object GetPropertyValue(IDictionaryAdapter dictionaryAdapter, string key,
                                       object storedValue, PropertyDescriptor property, bool ifExists)
        {
            if (storedValue == null && ifExists == false)
            {
                IValueInitializer initializer = null;

                if (Value != null)
                {
                    storedValue = Value;
                }
                else
                {
                    var type = Type ?? GetInferredType(dictionaryAdapter, property, out initializer);

                    if (IsAcceptedType(type))
                    {
                        if (type.GetTypeInfo().IsInterface)
                        {
                            if (property.IsDynamicProperty == false)
                            {
                                if (storedValue == null)
                                {
                                    storedValue = dictionaryAdapter.Create(property.PropertyType);
                                }
                            }
                        }
                        else if (type.GetTypeInfo().IsArray)
                        {
                            storedValue = Array.CreateInstance(type.GetElementType(), 0);
                        }
                        else
                        {
                            if (storedValue == null)
                            {
                                object[]        args        = null;
                                ConstructorInfo constructor = null;

                                if (property.IsDynamicProperty)
                                {
                                    constructor =
                                        (from ctor in type.GetConstructors()
                                         let parms = ctor.GetParameters()
                                                     where parms.Length == 1 &&
                                                     parms[0].ParameterType.IsAssignableFrom(dictionaryAdapter.Meta.Type)
                                                     select ctor).FirstOrDefault();

                                    if (constructor != null)
                                    {
                                        args = new[] { dictionaryAdapter }
                                    }
                                    ;
                                }

                                if (constructor == null)
                                {
                                    constructor = type.GetConstructor(Type.EmptyTypes);
                                }

                                if (constructor != null)
                                {
                                    storedValue = constructor.Invoke(args);
                                }
                            }
                        }
                    }
                }

                if (storedValue != null)
                {
                    using (dictionaryAdapter.SuppressNotificationsBlock())
                    {
                        if (storedValue is ISupportInitialize)
                        {
                            ((ISupportInitialize)storedValue).BeginInit();
                            ((ISupportInitialize)storedValue).EndInit();
                        }
                        if (initializer != null)
                        {
                            initializer.Initialize(dictionaryAdapter, storedValue);
                        }

                        property.SetPropertyValue(dictionaryAdapter, property.PropertyName,
                                                  ref storedValue, dictionaryAdapter.This.Descriptor);
                    }
                }
            }

            return(storedValue);
        }