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; } }
/// <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)); }
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; } }