Type[] GetGenericParametersForDeclaringType()
        {
            var parameters = TargetType.GetGenericArguments()
                             .Take(NumberOfGenericParametersOnDeclaringType);

            return(parameters.ToArray());
        }
        protected InjectAttributeProcessor([NotNull] MemberInfo member, [NotNull] T attribute)
            : base(member, attribute)
        {
            switch (member)
            {
            case FieldInfo field:
                TargetType   = field.FieldType;
                TargetSetter = field.SetValue;

                break;

            case PropertyInfo property:
                TargetType   = property.PropertyType;
                TargetSetter = property.SetValue;

                break;

            default:
                throw new InvalidOperationException($"Unknown member type: {member}.");
            }

            if (TargetType.IsGenericType && TargetType.GetGenericTypeDefinition() == typeof(IEnumerable <>))
            {
                DependencyType = TargetType.GetGenericArguments()[0] ?? TargetType;
                Enumerable     = DependencyType != TargetType;
            }
            else
            {
                DependencyType = TargetType;
            }
        }
        protected override void Initialize(ContentCompiler compiler)
        {
            base.Initialize(compiler);

            if (TargetType.IsGenericType)
            {
                _genericTypes = new List <ContentTypeWriter>();
                var arguments = TargetType.GetGenericArguments();
                foreach (var arg in arguments)
                {
                    _genericTypes.Add(compiler.GetTypeWriter(arg));
                }
            }
        }
        internal override void OnAddedToContentWriter(ContentWriter output)
        {
            base.OnAddedToContentWriter(output);

            if (TargetType.IsGenericType)
            {
                _genericTypes = new List <ContentTypeWriter>();
                var arguments = TargetType.GetGenericArguments();
                foreach (var arg in arguments)
                {
                    _genericTypes.Add(output.GetTypeWriter(arg));
                }
            }
        }
        protected InjectAttributeProcessor([NotNull] MemberInfo member, [NotNull] T attribute)
            : base(member, attribute)
        {
            switch (member)
            {
            case FieldInfo field:
                TargetType   = field.FieldType;
                TargetSetter = field.SetValue;

                break;

            case PropertyInfo property:
                TargetType = property.PropertyType;

                if (property.CanWrite)
                {
                    TargetSetter = property.SetValue;
                }
                else
                {
                    var writeableProperty = property.DeclaringType?.GetProperty(
                        property.Name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

                    if (writeableProperty == null)
                    {
                        throw new InvalidOperationException(
                                  $"Property '{property.DeclaringType?.Name}.{property.Name}' is not writeable.");
                    }

                    TargetSetter = writeableProperty.SetValue;
                }

                break;

            default:
                throw new InvalidOperationException($"Unknown member type: {member}.");
            }

            if (TargetType.IsGenericType && TargetType.GetGenericTypeDefinition() == typeof(IEnumerable <>))
            {
                DependencyType = TargetType.GetGenericArguments()[0] ?? TargetType;
                Enumerable     = DependencyType != TargetType;
            }
            else
            {
                DependencyType = TargetType;
            }
        }
Exemple #6
0
        /// <summary>
        /// Converts the given object to the type of this converter, using the specified context and culture information.
        /// </summary>
        /// <param name="context">An <see cref="T:System.ComponentModel.ITypeDescriptorContext"/> that provides a format context.</param>
        /// <param name="culture">The <see cref="T:System.Globalization.CultureInfo"/> to use as the current culture.</param>
        /// <param name="value">The <see cref="T:System.Object"/> to convert.</param>
        /// <returns>
        /// An <see cref="T:System.Object"/> that represents the converted value.
        /// </returns>
        /// <exception cref="T:System.NotSupportedException">
        /// The conversion cannot be performed.
        /// </exception>
        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            string valueAsString = value as string;

            if (valueAsString != null && valueAsString.StartsWith("(", StringComparison.OrdinalIgnoreCase) && valueAsString.EndsWith(")", StringComparison.OrdinalIgnoreCase))
            {
                if (valueAsString.Equals(_emptyString, StringComparison.OrdinalIgnoreCase))
                {
                    return(TargetType.GetConstructor(Type.EmptyTypes).Invoke(null));
                }
                return(TargetType.GetConstructors(BindingFlags.NonPublic | BindingFlags.Instance).Single().Invoke(new object[] {
                    valueAsString.Substring(1, valueAsString.Length - 2).Split(',').Select(
                        s => TypeConversion.FromString(TargetType.GetGenericArguments()[0], s))
                }));
            }
            return(base.ConvertFrom(context, culture, value));
        }
Exemple #7
0
        protected InjectAttributeProcessor(MemberInfo member, T attribute) : base(member, attribute)
        {
            switch (member)
            {
            case FieldInfo field:
                TargetType   = field.FieldType;
                TargetSetter = field.SetValue;

                break;

            case PropertyInfo property:
                TargetType = property.PropertyType;

                if (property.CanWrite)
                {
                    TargetSetter = property.SetValue;
                }
                else
                {
                    var writableProperty = property.DeclaringType?.GetProperty(
                        property.Name, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

                    if (writableProperty == null)
                    {
                        throw new InvalidOperationException(
                                  $"Property '{property.DeclaringType?.Name}.{property.Name}' is not writable.");
                    }

                    TargetSetter = writableProperty.SetValue;
                }

                break;

            default:
                throw new InvalidOperationException($"Unknown member type: {member}.");
            }

            DependencyType = TargetType;

            if (!TargetType.IsGenericType)
            {
                return;
            }

            var genType = TargetType.GetGenericTypeDefinition();

            if (genType == typeof(Option <>))
            {
                DependencyType = TargetType.GetGenericArguments()[0];

                Debug.Assert(DependencyType != null, "DependencyType != null");

                Optional = true;
            }
            else if (genType == typeof(IEnumerable <>))
            {
                DependencyType = TargetType.GetGenericArguments()[0];

                Debug.Assert(DependencyType != null, "DependencyType != null");

                Enumerable = true;
            }
        }