コード例 #1
0
 public MethodParameterValueInitializerInfo(int parameterIndex, [NotNull] IValueInitializer valueInitializer)
 {
     ParameterIndex   = parameterIndex;
     ValueInitializer = valueInitializer;
 }
コード例 #2
0
ファイル: OnDemandAttribute.cs プロジェクト: belav/Core
        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);
        }
コード例 #3
0
		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;
		}
コード例 #4
0
ファイル: OnDemandAttribute.cs プロジェクト: belav/Core
        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);
        }