Ejemplo n.º 1
0
        private Action <IServiceProvider, IComponent> CreateInitializer(Type type)
        {
            // Do all the reflection up front
            var injectableProperties =
                MemberAssignment.GetPropertiesIncludingInherited(type, _injectablePropertyBindingFlags)
                .Where(p => p.IsDefined(typeof(InjectAttribute)));

            var injectables = injectableProperties.Select(property =>
                                                          (
                                                              propertyName: property.Name,
                                                              propertyType: property.PropertyType,
                                                              setter: MemberAssignment.CreatePropertySetter(type, property, cascading: false)
                                                          )).ToArray();

            return(Initialize);

            // Return an action whose closure can write all the injected properties
            // without any further reflection calls (just typecasts)
            void Initialize(IServiceProvider serviceProvider, IComponent component)
            {
                foreach (var(propertyName, propertyType, setter) in injectables)
                {
                    var serviceInstance = serviceProvider.GetService(propertyType);
                    if (serviceInstance == null)
                    {
                        throw new InvalidOperationException($"Cannot provide a value for property " +
                                                            $"'{propertyName}' on type '{type.FullName}'. There is no " +
                                                            $"registered service of type '{propertyType}'.");
                    }

                    setter.SetValue(component, serviceInstance);
                }
            }
        }
Ejemplo n.º 2
0
 private static IEnumerable <PropertyInfo> GetBindableProperties(Type targetType)
 => MemberAssignment.GetPropertiesIncludingInherited(targetType, _bindablePropertyFlags)
 .Where(property => property.IsDefined(typeof(ParameterAttribute)));