From b667c60c7d93ff2ed2a327b5d64ef31931bf04d8 Mon Sep 17 00:00:00 2001 From: Mikhail <99481254+DCFApixels@users.noreply.github.com> Date: Mon, 5 Jun 2023 23:45:25 +0800 Subject: [PATCH] add CombineAttribute --- src/Attributes/SubjectAttributes.cs | 9 +++++++-- src/Subject/EcsSubjectDI.cs | 22 ++++++++++++---------- src/Utils/ReflectionExtensions.cs | 14 ++++++++++++++ 3 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 src/Utils/ReflectionExtensions.cs diff --git a/src/Attributes/SubjectAttributes.cs b/src/Attributes/SubjectAttributes.cs index 7a5e35a..7bc78dd 100644 --- a/src/Attributes/SubjectAttributes.cs +++ b/src/Attributes/SubjectAttributes.cs @@ -3,13 +3,19 @@ using System.Linq; namespace DCFApixels.DragonECS { - public class InjectAttribute : Attribute { } + public abstract class InjectAttribute : Attribute { } [AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)] public sealed class IncAttribute : InjectAttribute { } [AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)] public sealed class ExcAttribute : InjectAttribute { } [AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)] public sealed class OptAttribute : InjectAttribute { } + [AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)] + public sealed class CombineAttribute : InjectAttribute + { + public readonly int order = 0; + public CombineAttribute(int order = 0) => this.order = order; + } public abstract class ImplicitInjectAttribute : Attribute { } [AttributeUsage(AttributeTargets.Field | AttributeTargets.Class, Inherited = false, AllowMultiple = true)] @@ -17,7 +23,6 @@ namespace DCFApixels.DragonECS { public readonly Type type; public readonly bool isPool; - public IncImplicitAttribute(Type type) { this.type = type; diff --git a/src/Subject/EcsSubjectDI.cs b/src/Subject/EcsSubjectDI.cs index 8a02115..06eba86 100644 --- a/src/Subject/EcsSubjectDI.cs +++ b/src/Subject/EcsSubjectDI.cs @@ -23,6 +23,7 @@ namespace DCFApixels.DragonECS MethodInfo optionalMethod = builderType.GetMethod("Optional", BindingFlags.Instance | BindingFlags.Public); MethodInfo includeImplicitMethod = builderType.GetMethod("IncludeImplicit", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); MethodInfo excludeImplicitMethod = builderType.GetMethod("ExcludeImplicit", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); + MethodInfo combineMethod = builderType.GetMethod("Combine", BindingFlags.Instance | BindingFlags.Public); Type subjectType = s.GetType(); @@ -54,9 +55,9 @@ namespace DCFApixels.DragonECS foreach (var attribute in fieldInfo.GetCustomAttributes())//TODO убрать дублирование кода - вынести в отедльный метод { - if(attribute is IncImplicitAttribute incImplicit) + if (attribute is IncImplicitAttribute incImplicit) { - if(incImplicit.isPool) + if (incImplicit.isPool) incluedMethod.MakeGenericMethod(incImplicit.type).Invoke(b, null); else includeImplicitMethod.Invoke(b, new object[] { incImplicit.type }); @@ -72,28 +73,29 @@ namespace DCFApixels.DragonECS } }//TODO КОНЕЦ убрать дублирование кода - вынести в отедльный метод - if (fieldInfo.GetCustomAttribute() == null) - continue; - if (fieldType.IsGenericType == false) + if (!fieldInfo.TryGetAttribute(out InjectAttribute injectAttribute)) continue; - //Type componentType = fieldType.GenericTypeArguments[0]; - - if (fieldInfo.GetCustomAttribute() != null) + if (injectAttribute is IncAttribute) { fieldInfo.SetValue(s, incluedMethod.MakeGenericMethod(fieldType).Invoke(b, null)); continue; } - if (fieldInfo.GetCustomAttribute() != null) + if (injectAttribute is ExcAttribute) { fieldInfo.SetValue(s, excludeMethod.MakeGenericMethod(fieldType).Invoke(b, null)); continue; } - if (fieldInfo.GetCustomAttribute() != null) + if (injectAttribute is OptAttribute) { fieldInfo.SetValue(s, optionalMethod.MakeGenericMethod(fieldType).Invoke(b, null)); continue; } + if (injectAttribute is CombineAttribute combAttribute) + { + fieldInfo.SetValue(s, combineMethod.MakeGenericMethod(fieldType).Invoke(b, new object[] { combAttribute.order })); + continue; + } } } } diff --git a/src/Utils/ReflectionExtensions.cs b/src/Utils/ReflectionExtensions.cs new file mode 100644 index 0000000..e4ffc49 --- /dev/null +++ b/src/Utils/ReflectionExtensions.cs @@ -0,0 +1,14 @@ +using System; +using System.Reflection; + +namespace DCFApixels.DragonECS +{ + internal static class ReflectionExtensions + { + public static bool TryGetAttribute(this MemberInfo self, out T attribute) where T : Attribute + { + attribute = self.GetCustomAttribute(); + return attribute != null; + } + } +}