Beispiel #1
0
        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.IsInterface)
                        {
                            if (property.IsDynamicProperty == false)
                            {
                                if (storedValue == null)
                                {
                                    storedValue = dictionaryAdapter.Create(property.PropertyType);
                                }
                            }
                        }
                        else if (type.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);
        }
		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.IsInterface)
						{
							if (property.IsDynamicProperty == false)
							{
								if (storedValue == null)
								{
									storedValue = dictionaryAdapter.Create(property.PropertyType);
								}
							}
						}
						else if (type.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 !SL3
						if (storedValue is ISupportInitialize)
						{
							((ISupportInitialize)storedValue).BeginInit();
							((ISupportInitialize)storedValue).EndInit();
						}
#endif
						if (initializer != null)
						{
							initializer.Initialize(dictionaryAdapter, storedValue);
						}

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

			return storedValue;
		}