diff --git a/src/Microsoft.AspNetCore.Blazor/Components/ComponentFactory.cs b/src/Microsoft.AspNetCore.Blazor/Components/ComponentFactory.cs index 18ce39f2c0..0b5c644ce9 100644 --- a/src/Microsoft.AspNetCore.Blazor/Components/ComponentFactory.cs +++ b/src/Microsoft.AspNetCore.Blazor/Components/ComponentFactory.cs @@ -56,7 +56,7 @@ namespace Microsoft.AspNetCore.Blazor.Components { // Do all the reflection up front var injectableProperties = type.GetTypeInfo() - .GetProperties(_injectablePropertyBindingFlags) + .GetPropertiesIncludingInherited(_injectablePropertyBindingFlags) .Where(p => p.GetCustomAttribute() != null); var injectables = injectableProperties.Select(property => { diff --git a/src/Microsoft.AspNetCore.Blazor/TypeInfoExtensions.cs b/src/Microsoft.AspNetCore.Blazor/TypeInfoExtensions.cs new file mode 100644 index 0000000000..c512230f7c --- /dev/null +++ b/src/Microsoft.AspNetCore.Blazor/TypeInfoExtensions.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using System.Linq; +using System.Reflection; + +namespace Microsoft.AspNetCore.Blazor +{ + public static class TypeInfoExtensions + { + public static IEnumerable GetPropertiesIncludingInherited(this TypeInfo typeInfo, BindingFlags bindingFlags) + { + while (typeInfo != null) + { + var properties = typeInfo.GetProperties(bindingFlags) + .Where(prop => prop.ReflectedType == prop.DeclaringType); + foreach (var property in properties) + yield return property; + + typeInfo = typeInfo.BaseType?.GetTypeInfo(); + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Blazor.Test/DependencyInjectionTest.cs b/test/Microsoft.AspNetCore.Blazor.Test/DependencyInjectionTest.cs index f4d790a430..80a2063a77 100644 --- a/test/Microsoft.AspNetCore.Blazor.Test/DependencyInjectionTest.cs +++ b/test/Microsoft.AspNetCore.Blazor.Test/DependencyInjectionTest.cs @@ -117,6 +117,20 @@ namespace Microsoft.AspNetCore.Blazor.Test Assert.Same(serviceInstance, instance.MyService); } + [Fact] + public void SetsPrivateInheritedInjectableProperties() + { + // Arrange + var serviceInstance = new MyServiceImplementation(); + _serviceProvider.AddService(serviceInstance); + + // Act + var instance = InstantiateComponent(); + + // Assert + Assert.Same(serviceInstance, instance.PrivateMyService); + } + private T InstantiateComponent() where T: IComponent => _renderer.InstantiateComponent(); @@ -143,6 +157,15 @@ namespace Microsoft.AspNetCore.Blazor.Test [Inject] public IMyService MyService { get; set; } } + class HasPrivateInjectableProperty : TestComponent + { + [Inject] private IMyService MyService { get; set; } + + public IMyService PrivateMyService => MyService; + } + + class HasInheritedPrivateInjectableProperty : HasPrivateInjectableProperty { } + class HasManyInjectableProperties : TestComponent { [Inject] public IMyService PublicReadWrite { get; set; }