Ejemplo n.º 1
0
        protected override ITypeInfo GetValueTypeInfo()
        {
            var classInfo = TypeHelper.GetTypeInfo(this, ConfigurationFileAttributeNames.DeclaringClass,
                                                   ConfigurationFileAttributeNames.Assembly, ConfigurationFileAttributeNames.DeclaringClassRef);

            IEnumerable <IParameter> parameters;

            if (_parameters == null)
            {
                parameters = new List <IParameter>();
            }
            else
            {
                parameters = _parameters.AllParameters;
            }

            var memberName = GetAttributeValue(ConfigurationFileAttributeNames.MemberName);

            ClassMemberData = _classMemberValueInitializerHelper.GetClassMemberData(this, $"{classInfo.TypeCSharpFullName}.{memberName}", parameters);

            return(ClassMemberData.MemberTypeInfo);
        }
        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);
        }