public MethodParameterValueInitializerInfo(int parameterIndex, [NotNull] IValueInitializer valueInitializer) { ParameterIndex = parameterIndex; ValueInitializer = valueInitializer; }
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); }
private Type GetInferredType(IDictionaryAdapter dictionaryAdapter, PropertyDescriptor property, out IValueInitializer initializer) { Type type = null; initializer = null; type = property.PropertyType; if (typeof(IEnumerable).IsAssignableFrom(type) == false) { return type; } Type collectionType = null; if (type.IsGenericType) { var genericDef = type.GetGenericTypeDefinition(); var genericArg = type.GetGenericArguments()[0]; bool isBindingList = #if SILVERLIGHT false; #else genericDef == typeof(BindingList<>); #endif if (isBindingList || genericDef == typeof(List<>)) { if (dictionaryAdapter.CanEdit) { #if SILVERLIGHT collectionType = typeof(EditableList<>); #else collectionType = isBindingList ? typeof(EditableBindingList<>) : typeof(EditableList<>); #endif } #if SILVERLIGHT //never true #else if (isBindingList && genericArg.IsInterface) { Func<object> addNew = () => dictionaryAdapter.Create(genericArg); initializer = (IValueInitializer)Activator.CreateInstance( typeof(BindingListInitializer<>).MakeGenericType(genericArg), null, addNew, null, null); } #endif } else if (genericDef == typeof(IList<>) || genericDef == typeof(ICollection<>)) { collectionType = dictionaryAdapter.CanEdit ? typeof(EditableList<>) : typeof(List<>); } if (collectionType != null) { return collectionType.MakeGenericType(genericArg); } } else if (type == typeof(IList) || type == typeof(ICollection)) { return dictionaryAdapter.CanEdit ? typeof(EditableList) : typeof(List<object>); } return type; }
private static Type GetInferredType( IDictionaryAdapter dictionaryAdapter, PropertyDescriptor property, out IValueInitializer initializer ) { Type type = null; initializer = null; type = property.PropertyType; if (typeof(IEnumerable).IsAssignableFrom(type) == false) { return(type); } Type collectionType = null; if (type.IsGenericType) { var genericDef = type.GetGenericTypeDefinition(); var genericArg = type.GetGenericArguments()[0]; bool isBindingList = genericDef == typeof(System.ComponentModel.BindingList <>); if (isBindingList || genericDef == typeof(List <>)) { if (dictionaryAdapter.CanEdit) { collectionType = isBindingList ? typeof(EditableBindingList <>) : typeof(EditableList <>); } if (isBindingList && genericArg.IsInterface) { Func <object> addNew = () => dictionaryAdapter.Create(genericArg); initializer = (IValueInitializer)Activator.CreateInstance( typeof(BindingListInitializer <>).MakeGenericType(genericArg), null, addNew, null, null, null ); } } else if (genericDef == typeof(IList <>) || genericDef == typeof(ICollection <>)) { collectionType = dictionaryAdapter.CanEdit ? typeof(EditableList <>) : typeof(List <>); } if (collectionType != null) { return(collectionType.MakeGenericType(genericArg)); } } else if (type == typeof(IList) || type == typeof(ICollection)) { return(dictionaryAdapter.CanEdit ? typeof(EditableList) : typeof(List <object>)); } return(type); }
public override void Initialize() { base.Initialize(); var attributeNamePrefix = "parameter"; var methodParameters = ParentAutoGeneratedServiceMethodElement.ImplementedMehodInfo.GetParameters() ?? new ParameterInfo[0]; foreach (var attribute in _xmlElement.Attributes) { var xmlAttribute = attribute as XmlAttribute; if (xmlAttribute == null) { continue; } if (xmlAttribute.Name.StartsWith(attributeNamePrefix) && int.TryParse(xmlAttribute.Name.Substring(attributeNamePrefix.Length), out var parameterIndex)) { // Lets make parameterIndex 0 based. --parameterIndex; if (methodParameters.Length <= parameterIndex) { // TODO: handle the case of params parameter for variable number of parameters throw new ConfigurationParseException(this, $"Method '{ParentAutoGeneratedServiceMethodElement.Name}' has only {ParentAutoGeneratedServiceMethodElement.MethodSignatureElement?.Parameters.Count ?? 0} parameters."); } var reflectiparameterInfo = methodParameters[parameterIndex]; var methodSignatureParameter = ParentAutoGeneratedServiceMethodElement.MethodSignatureElement.Parameters[parameterIndex]; var attributeValue = GetAttributeValue(xmlAttribute.Name); IValueInitializer valueInitializer = null; var valueAsString = attributeValue; if (attributeValue.StartsWith(SettingReferencePrefix)) { valueAsString = attributeValue.Substring(SettingReferencePrefix.Length).Trim(); var settingElement = _settingValueInitializerHelper.GetSettingElement(this, valueAsString); valueInitializer = new SettingValueInitializer(settingElement); } else if (attributeValue.StartsWith(ClassMemberReferencePrefix)) { // Lets call de-serialize to make sure the value is correct valueAsString = attributeValue.Substring(ClassMemberReferencePrefix.Length).Trim(); var classMemberData = _classMemberValueInitializerHelper.GetClassMemberData(this, valueAsString, new IParameter[0]); valueInitializer = new ClassMemberValueInitializer(this, _classMemberValueInitializerHelper, classMemberData); } else { // Lets call de-serialize to make sure the value is correct _deserializedFromStringValueInitializerHelper.GetDeserializedValue(this, methodSignatureParameter.ValueTypeInfo, valueAsString); valueInitializer = new DeserializedFromStringValueInitializer(this, methodSignatureParameter.ValueTypeInfo, valueAsString, _deserializedFromStringValueInitializerHelper); } if (valueInitializer == null) { throw new ConfigurationParseException(this, $"The value of parameter '{xmlAttribute.Name}' is invalid. The value is : '{xmlAttribute.Value}'."); } var valueTypeInfo = valueInitializer.ValueTypeInfo; if (!methodSignatureParameter.ValueTypeInfo.Type.IsAssignableFrom(valueTypeInfo.Type)) { throw new ConfigurationParseException(this, string.Format("The '{0}'-th parameter named '{1}' is of type '{2}' which is not assignable from provided value which is of type '{3}'.", parameterIndex, reflectiparameterInfo.Name, methodSignatureParameter.ValueTypeInfo.TypeCSharpFullName, valueTypeInfo.TypeCSharpFullName)); } _parameterValueInitializers.Add(new MethodParameterValueInitializerInfo(parameterIndex, valueInitializer)); } } _parameterValueInitializers.Sort((x, y) => x.ParameterIndex - y.ParameterIndex); }