mirror of
https://github.com/DCFApixels/DragonECS-AutoInjections.git
synced 2025-09-18 05:04:35 +08:00
add CombineAttribute
This commit is contained in:
parent
7d55cf82e4
commit
b667c60c7d
@ -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;
|
||||||
|
@ -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();
|
||||||
|
|
||||||
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
14
src/Utils/ReflectionExtensions.cs
Normal file
14
src/Utils/ReflectionExtensions.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user