From 71150c60d3a7472a5f1b480579d28175f5fb8eb6 Mon Sep 17 00:00:00 2001 From: YoshiRulz Date: Wed, 18 May 2022 15:04:20 +1000 Subject: [PATCH] Also check non-public `ApiContainer` properties when injecting APIs --- src/BizHawk.Client.Common/Api/ApiInjector.cs | 2 +- src/BizHawk.Common/Extensions/ReflectionExtensions.cs | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/BizHawk.Client.Common/Api/ApiInjector.cs b/src/BizHawk.Client.Common/Api/ApiInjector.cs index 72727eae25..5f0587417a 100644 --- a/src/BizHawk.Client.Common/Api/ApiInjector.cs +++ b/src/BizHawk.Client.Common/Api/ApiInjector.cs @@ -35,7 +35,7 @@ namespace BizHawk.Client.Common Type targetType = target.GetType(); object[] tmp = new object[1]; - targetType.GetProperties().FirstOrDefault(pi => pi.PropertyType == typeof(ApiContainer)) + targetType.GetProperties(ReflectionExtensions.DI_TARGET_PROPS).FirstOrDefault(pi => pi.PropertyType == typeof(ApiContainer)) ?.SetValue(target, source.Container); foreach (var propinfo in targetType.GetPropertiesWithAttrib(typeof(RequiredApiAttribute))) diff --git a/src/BizHawk.Common/Extensions/ReflectionExtensions.cs b/src/BizHawk.Common/Extensions/ReflectionExtensions.cs index 6caef05ab0..94ea1ee650 100644 --- a/src/BizHawk.Common/Extensions/ReflectionExtensions.cs +++ b/src/BizHawk.Common/Extensions/ReflectionExtensions.cs @@ -11,15 +11,18 @@ namespace BizHawk.Common.ReflectionExtensions /// public static class ReflectionExtensions { + /// filter used when looking for [RequiredApi] et al. by reflection for dependency injection + public const BindingFlags DI_TARGET_PROPS = BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic; + public static IEnumerable GetPropertiesWithAttrib(this Type type, Type attributeType) { - return type.GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic) + return type.GetProperties(DI_TARGET_PROPS) .Where(p => p.GetCustomAttributes(attributeType, false).Length > 0); } public static IEnumerable GetMethodsWithAttrib(this Type type, Type attributeType) { - return type.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic) + return type.GetMethods(DI_TARGET_PROPS) .Where(p => p.GetCustomAttributes(attributeType, false).Length > 0); }