add CombineAttribute

This commit is contained in:
Mikhail 2023-06-05 23:45:25 +08:00
parent 7d55cf82e4
commit b667c60c7d
3 changed files with 33 additions and 12 deletions

View File

@ -3,13 +3,19 @@ using System.Linq;
namespace DCFApixels.DragonECS namespace DCFApixels.DragonECS
{ {
public class InjectAttribute : Attribute { } public abstract class InjectAttribute : Attribute { }
[AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)] [AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)]
public sealed class IncAttribute : InjectAttribute { } public sealed class IncAttribute : InjectAttribute { }
[AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)] [AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)]
public sealed class ExcAttribute : InjectAttribute { } public sealed class ExcAttribute : InjectAttribute { }
[AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)] [AttributeUsage(AttributeTargets.Field, Inherited = false, AllowMultiple = false)]
public sealed class OptAttribute : InjectAttribute { } 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 { } public abstract class ImplicitInjectAttribute : Attribute { }
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Class, Inherited = false, AllowMultiple = true)] [AttributeUsage(AttributeTargets.Field | AttributeTargets.Class, Inherited = false, AllowMultiple = true)]
@ -17,7 +23,6 @@ namespace DCFApixels.DragonECS
{ {
public readonly Type type; public readonly Type type;
public readonly bool isPool; public readonly bool isPool;
public IncImplicitAttribute(Type type) public IncImplicitAttribute(Type type)
{ {
this.type = type; this.type = type;

View File

@ -23,6 +23,7 @@ namespace DCFApixels.DragonECS
MethodInfo optionalMethod = builderType.GetMethod("Optional", BindingFlags.Instance | BindingFlags.Public); MethodInfo optionalMethod = builderType.GetMethod("Optional", BindingFlags.Instance | BindingFlags.Public);
MethodInfo includeImplicitMethod = builderType.GetMethod("IncludeImplicit", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); MethodInfo includeImplicitMethod = builderType.GetMethod("IncludeImplicit", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
MethodInfo excludeImplicitMethod = builderType.GetMethod("ExcludeImplicit", 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(); Type subjectType = s.GetType();
@ -54,9 +55,9 @@ namespace DCFApixels.DragonECS
foreach (var attribute in fieldInfo.GetCustomAttributes<ImplicitInjectAttribute>())//TODO убрать дублирование кода - вынести в отедльный метод foreach (var attribute in fieldInfo.GetCustomAttributes<ImplicitInjectAttribute>())//TODO убрать дублирование кода - вынести в отедльный метод
{ {
if(attribute is IncImplicitAttribute incImplicit) if (attribute is IncImplicitAttribute incImplicit)
{ {
if(incImplicit.isPool) if (incImplicit.isPool)
incluedMethod.MakeGenericMethod(incImplicit.type).Invoke(b, null); incluedMethod.MakeGenericMethod(incImplicit.type).Invoke(b, null);
else else
includeImplicitMethod.Invoke(b, new object[] { incImplicit.type }); includeImplicitMethod.Invoke(b, new object[] { incImplicit.type });
@ -72,28 +73,29 @@ namespace DCFApixels.DragonECS
} }
}//TODO КОНЕЦ убрать дублирование кода - вынести в отедльный метод }//TODO КОНЕЦ убрать дублирование кода - вынести в отедльный метод
if (fieldInfo.GetCustomAttribute<InjectAttribute>() == null) if (!fieldInfo.TryGetAttribute(out InjectAttribute injectAttribute))
continue;
if (fieldType.IsGenericType == false)
continue; continue;
//Type componentType = fieldType.GenericTypeArguments[0]; if (injectAttribute is IncAttribute)
if (fieldInfo.GetCustomAttribute<IncAttribute>() != null)
{ {
fieldInfo.SetValue(s, incluedMethod.MakeGenericMethod(fieldType).Invoke(b, null)); fieldInfo.SetValue(s, incluedMethod.MakeGenericMethod(fieldType).Invoke(b, null));
continue; continue;
} }
if (fieldInfo.GetCustomAttribute<ExcAttribute>() != null) if (injectAttribute is ExcAttribute)
{ {
fieldInfo.SetValue(s, excludeMethod.MakeGenericMethod(fieldType).Invoke(b, null)); fieldInfo.SetValue(s, excludeMethod.MakeGenericMethod(fieldType).Invoke(b, null));
continue; continue;
} }
if (fieldInfo.GetCustomAttribute<OptAttribute>() != null) if (injectAttribute is OptAttribute)
{ {
fieldInfo.SetValue(s, optionalMethod.MakeGenericMethod(fieldType).Invoke(b, null)); fieldInfo.SetValue(s, optionalMethod.MakeGenericMethod(fieldType).Invoke(b, null));
continue; continue;
} }
if (injectAttribute is CombineAttribute combAttribute)
{
fieldInfo.SetValue(s, combineMethod.MakeGenericMethod(fieldType).Invoke(b, new object[] { combAttribute.order }));
continue;
}
} }
} }
} }

View File

@ -0,0 +1,14 @@
using System;
using System.Reflection;
namespace DCFApixels.DragonECS
{
internal static class ReflectionExtensions
{
public static bool TryGetAttribute<T>(this MemberInfo self, out T attribute) where T : Attribute
{
attribute = self.GetCustomAttribute<T>();
return attribute != null;
}
}
}