public bool TryCreate(IDictionary <string, object> data, out object result) { bool anyPropertiesSet = false; object obj = Activator.CreateInstance(_concreteType); object value; foreach (var propertyInfo in _concreteType.GetProperties().Where(pi => CanSetProperty(pi, data))) { value = data[propertyInfo.Name]; if (ConcreteCollectionTypeCreator.IsCollectionType(propertyInfo.PropertyType)) { if (!ConcreteCollectionTypeCreator.TryCreate(propertyInfo.PropertyType, (IEnumerable)value, out value)) { continue; } } else { var subData = value as IDictionary <string, object>; if (subData != null && !ConcreteTypeCreator.Get(propertyInfo.PropertyType).TryCreate(subData, out value)) { continue; } } propertyInfo.SetValue(obj, value, null); anyPropertiesSet = true; } result = anyPropertiesSet ? obj : null; return(anyPropertiesSet); }
public override bool TryConvert(ConvertBinder binder, out object result) { if (ConcreteCollectionTypeCreator.IsCollectionType(binder.Type)) { if (ConcreteCollectionTypeCreator.TryCreate(binder.Type, this, out result)) { return(true); } } return(base.TryConvert(binder, out result)); }
public override bool TryConvert(ConvertBinder binder, out object result) { if (binder.Type == typeof(IEnumerable <object>)) { result = Cast <object>(); return(true); } if (ConcreteCollectionTypeCreator.IsCollectionType(binder.Type)) { if (ConcreteCollectionTypeCreator.TryCreate(binder.Type, this, out result)) { return(true); } } return(base.TryConvert(binder, out result)); }