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 IDictionary <string, WriteParameterAction> CreateParameterWriters(Type targetType)
        {
            var result = new Dictionary <string, WriteParameterAction>(StringComparer.OrdinalIgnoreCase);

            foreach (var propertyInfo in GetBindableProperties(targetType))
            {
                var propertySetter = MemberAssignment.CreatePropertySetter(targetType, propertyInfo);

                var propertyName = propertyInfo.Name;
                if (result.ContainsKey(propertyName))
                {
                    throw new InvalidOperationException(
                              $"The type '{targetType.FullName}' declares more than one parameter matching the " +
                              $"name '{propertyName.ToLowerInvariant()}'. Parameter names are case-insensitive and must be unique.");
                }

                result.Add(propertyName, (ref RenderTreeFrame frame, object target) =>
                {
                    propertySetter.SetValue(target, frame.AttributeValue);
                });
            }

            return(result);
        }