using System; using System.Collections; using System.Collections.Generic; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Security.Cryptography; using BITKit.UX; using Newtonsoft.Json; using Unity.Collections; using Unity.Collections.LowLevel.Unsafe; using UnityEngine; using UnityEngine.UIElements; namespace BITKit.IData { public class UXDataBindingService : MonoBehaviour { [RuntimeInitializeOnLoadMethod] private static void Reload() { _Binders.Clear(); _Instances.Clear(); } private static readonly Dictionary _Binders = new(); private static readonly CacheList _Instances = new(); public static IUXDataBinder Create(object target,FieldInfo fieldInfo) { var value = fieldInfo.GetValue(target); var type = value?.GetType() ?? fieldInfo.FieldType; // if (value is IEnumerable) // { // //type = typeof(IEnumerable<>).MakeGenericType(fieldInfo.FieldType.GetElementType()); // //type = typeof(IEnumerable<>).MakeGenericType(type.GetGenericArguments()); // } switch (value) { case Array: type = typeof(IEnumerable<>).MakeGenericType(fieldInfo.FieldType.GetElementType()); break; case IList: type = typeof(IEnumerable<>).MakeGenericType(type.GetGenericArguments()); break; } if (_Binders.TryGetValue(type, out var binder) is false) throw new NotImplementedException($"未支持的类型:{type.Name}"); var instance = (IUXDataBinder)Activator.CreateInstance(binder.GetType()); _Instances.Add(instance); return instance; } [SerializeReference, SubclassSelector] private ITicker ticker; private async void Start() { var binders = await ReflectionHelper.GetTypes(); if(destroyCancellationToken.IsCancellationRequested)return; foreach (var x in binders) { var instance = (IUXDataBinder)Activator.CreateInstance(x); if (_Binders.TryAdd(instance.TargetType, instance)) ; } ticker.Add(OnTick); destroyCancellationToken.Register(() => { ticker.Remove(OnTick); }); } private static void OnTick(float obj) { var array = _Instances.ValueArray; foreach (var x in array) { if (x.VisualElement.panel is null) { _Instances.Remove(x); continue; } x.OnTick(obj); } } } }