DragonECS-AutoInjections/src/Subject/EcsSubjectDI.cs

101 lines
4.7 KiB
C#
Raw Normal View History

2023-05-07 00:50:23 +08:00
using System;
using System.Reflection;
namespace DCFApixels.DragonECS
{
public abstract class EcsSubjectDI : EcsSubject
{
2023-05-23 01:48:00 +08:00
protected sealed override void Init(Builder b)
{
EcsSubjectDIHelper.Fill(this, b);
InitAfterDI(b);
}
protected virtual void InitAfterDI(Builder b) { }
2023-05-07 00:50:23 +08:00
}
2023-05-23 01:48:00 +08:00
internal static class EcsSubjectDIHelper
2023-05-07 00:50:23 +08:00
{
public static void Fill(EcsSubject s, EcsSubject.Builder b)
{
Type builderType = b.GetType();
MethodInfo incluedMethod = builderType.GetMethod("Include", BindingFlags.Instance | BindingFlags.Public);
MethodInfo excludeMethod = builderType.GetMethod("Exclude", BindingFlags.Instance | BindingFlags.Public);
2023-06-04 19:42:46 +08:00
MethodInfo optionalMethod = builderType.GetMethod("Optional", BindingFlags.Instance | BindingFlags.Public);
2023-05-28 22:29:24 +08:00
MethodInfo includeImplicitMethod = builderType.GetMethod("IncludeImplicit", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
MethodInfo excludeImplicitMethod = builderType.GetMethod("ExcludeImplicit", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
2023-05-07 00:50:23 +08:00
Type subjectType = s.GetType();
foreach (var attribute in subjectType.GetCustomAttributes<ImplicitInjectAttribute>())//TODO убрать дублирование кода - вынести в отедльный метод
{
if (attribute is IncImplicitAttribute incImplicit)
{
if (incImplicit.isPool)
2023-06-04 19:04:22 +08:00
incluedMethod.MakeGenericMethod(incImplicit.type).Invoke(b, null);
2023-05-07 00:50:23 +08:00
else
2023-06-04 19:04:22 +08:00
includeImplicitMethod.Invoke(b, new object[] { incImplicit.type });
2023-05-07 00:50:23 +08:00
continue;
}
if (attribute is ExcImplicitAttribute excImplicit)
{
if (excImplicit.isPool)
2023-06-04 19:04:22 +08:00
excludeMethod.MakeGenericMethod(excImplicit.type).Invoke(b, null);
2023-05-07 00:50:23 +08:00
else
2023-06-04 19:04:22 +08:00
excludeImplicitMethod.Invoke(b, new object[] { excImplicit.type });
2023-05-07 00:50:23 +08:00
continue;
}
}//TODO КОНЕЦ убрать дублирование кода - вынести в отедльный метод
FieldInfo[] fieldInfos = subjectType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
foreach (FieldInfo fieldInfo in fieldInfos)
{
Type fieldType = fieldInfo.FieldType;
foreach (var attribute in fieldInfo.GetCustomAttributes<ImplicitInjectAttribute>())//TODO убрать дублирование кода - вынести в отедльный метод
{
if(attribute is IncImplicitAttribute incImplicit)
{
if(incImplicit.isPool)
2023-06-04 19:04:22 +08:00
incluedMethod.MakeGenericMethod(incImplicit.type).Invoke(b, null);
2023-05-07 00:50:23 +08:00
else
2023-06-04 19:04:22 +08:00
includeImplicitMethod.Invoke(b, new object[] { incImplicit.type });
2023-05-07 00:50:23 +08:00
continue;
}
if (attribute is ExcImplicitAttribute excImplicit)
{
if (excImplicit.isPool)
2023-06-04 19:04:22 +08:00
excludeMethod.MakeGenericMethod(excImplicit.type).Invoke(b, null);
2023-05-07 00:50:23 +08:00
else
2023-06-04 19:04:22 +08:00
excludeImplicitMethod.Invoke(b, new object[] { excImplicit.type });
2023-05-07 00:50:23 +08:00
continue;
}
}//TODO КОНЕЦ убрать дублирование кода - вынести в отедльный метод
if (fieldInfo.GetCustomAttribute<InjectAttribute>() == null)
continue;
if (fieldType.IsGenericType == false)
continue;
2023-06-04 19:04:22 +08:00
//Type componentType = fieldType.GenericTypeArguments[0];
2023-05-07 00:50:23 +08:00
if (fieldInfo.GetCustomAttribute<IncAttribute>() != null)
{
2023-06-04 19:04:22 +08:00
fieldInfo.SetValue(s, incluedMethod.MakeGenericMethod(fieldType).Invoke(b, null));
2023-05-07 00:50:23 +08:00
continue;
}
if (fieldInfo.GetCustomAttribute<ExcAttribute>() != null)
{
2023-06-04 19:04:22 +08:00
fieldInfo.SetValue(s, excludeMethod.MakeGenericMethod(fieldType).Invoke(b, null));
2023-05-07 00:50:23 +08:00
continue;
}
if (fieldInfo.GetCustomAttribute<OptAttribute>() != null)
{
2023-06-04 19:04:22 +08:00
fieldInfo.SetValue(s, optionalMethod.MakeGenericMethod(fieldType).Invoke(b, null));
2023-05-07 00:50:23 +08:00
continue;
}
}
}
}
}