internal static InjectionHook HookFor(FieldInfo fieldInfo) { InjectionHook hook; if (s_HasHooks) { using (List <InjectionHook> .Enumerator enumerator = k_Hooks.GetEnumerator()) { while (true) { if (!enumerator.MoveNext()) { break; } InjectionHook current = enumerator.Current; if (current.IsInterestedInField(fieldInfo)) { return(current); } } } hook = null; } else { hook = null; } return(hook); }
public static void UnregisterHook(InjectionHook hook) { k_Hooks.Remove(hook); s_HasHooks = k_Hooks.Count != 0; }
public static void RegisterHook(InjectionHook hook) { s_HasHooks = true; k_Hooks.Add(hook); }
private static string CollectInjectedGroup(ComponentSystemBase system, FieldInfo groupField, Type injectedGroupType, out FieldInfo entityArrayField, out FieldInfo indexFromEntityField, InjectionContext injectionContext, out FieldInfo lengthField, out FieldInfo componentGroupIndexField, ISet <ComponentType> componentRequirements, ICollection <InjectionData> componentDataInjections, ICollection <InjectionData> bufferDataInjections, ICollection <InjectionData> sharedComponentInjections) { string str; FieldInfo[] fields = injectedGroupType.GetFields(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance); entityArrayField = null; indexFromEntityField = null; lengthField = null; componentGroupIndexField = null; FieldInfo[] infoArray2 = fields; int index = 0; while (true) { if (index >= infoArray2.Length) { if (injectionContext.HasComponentRequirements) { foreach (ComponentType type in injectionContext.ComponentRequirements) { componentRequirements.Add(type); } } str = null; break; } FieldInfo field = infoArray2[index]; bool isReadOnly = field.GetCustomAttributes(typeof(ReadOnlyAttribute), true).Length != 0; if (field.FieldType.IsGenericType && (field.FieldType.GetGenericTypeDefinition() == typeof(ComponentDataArray <>))) { InjectionData item = new InjectionData(field, field.FieldType.GetGenericArguments()[0], isReadOnly); componentDataInjections.Add(item); componentRequirements.Add(item.ComponentType); } else if (field.FieldType.IsGenericType && (field.FieldType.GetGenericTypeDefinition() == typeof(SubtractiveComponent <>))) { componentRequirements.Add(ComponentType.Subtractive(field.FieldType.GetGenericArguments()[0])); } else if (field.FieldType.IsGenericType && (field.FieldType.GetGenericTypeDefinition() == typeof(BufferArray <>))) { InjectionData item = new InjectionData(field, field.FieldType.GetGenericArguments()[0], isReadOnly); bufferDataInjections.Add(item); componentRequirements.Add(item.ComponentType); } else if (field.FieldType.IsGenericType && (field.FieldType.GetGenericTypeDefinition() == typeof(SharedComponentDataArray <>))) { if (!isReadOnly) { str = $"{system.GetType().Name}:{groupField.Name} SharedComponentDataArray<> must always be injected as [ReadOnly]"; break; } InjectionData item = new InjectionData(field, field.FieldType.GetGenericArguments()[0], true); sharedComponentInjections.Add(item); componentRequirements.Add(item.ComponentType); } else if (field.FieldType == typeof(EntityArray)) { if (entityArrayField != null) { str = $"{system.GetType().Name}:{groupField.Name} An [Inject] struct, may only contain a single EntityArray"; break; } entityArrayField = field; } else if (!(field.FieldType == typeof(int))) { InjectionHook hook = InjectionHookSupport.HookFor(field); if (hook == null) { str = $"{system.GetType().Name}:{groupField.Name} [Inject] may only be used on ComponentDataArray<>, ComponentArray<>, TransformAccessArray, EntityArray, {string.Join(",", (IEnumerable<string>) (from h in InjectionHookSupport.Hooks select h.FieldTypeOfInterest.Name))} and int Length."; break; } string str2 = hook.ValidateField(field, isReadOnly, injectionContext); if (str2 != null) { str = str2; break; } injectionContext.AddEntry(hook.CreateInjectionInfoFor(field, isReadOnly)); } else { if ((field.Name != "Length") && (field.Name != "GroupIndex")) { str = $"{system.GetType().Name}:{groupField.Name} Int in an [Inject] struct should be named " Length " (group length) or " GroupIndex " (index in ComponentGroup[])"; break; } if (!field.IsInitOnly) { str = $"{system.GetType().Name}:{groupField.Name} {field.Name} must use the " readonly " keyword";