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); }