using System; using System.Collections.Generic; using UnityEngine; namespace XericUI.ReflectionUIGenerator { /// /// 可配置的冲突解决器 ScriptableObject /// 预配置各种冲突场景下的决策方法,以及可注册的自定义解析器列表 /// [CreateAssetMenu( fileName = "Xeric UI avr Resolver Config", menuName = "Xeric Library/UI Action Vessel/Reflection UI Gen/UI avr Resolver Config", order = 20)] public class AvrgMvvmResolverConfig : ScriptableObject, IAvrgMvvmConflictResolver { /// 全局默认冲突解决策略 [Tooltip("全局默认冲突解决策略")] public ConflictResolutionStrategy defaultStrategy = ConflictResolutionStrategy.PreferUI; /// 自定义解析器列表(按序尝试) [Tooltip("自定义解析器类型全名列表(按序尝试,需实现 IAvrgMvvmConflictResolver)")] public List customResolverTypeNames = new List(); // 运行时已实例化的解析器缓存 [NonSerialized] private List _resolverInstances; /// /// 获取或实例化自定义解析器 /// private List GetResolverInstances() { if (_resolverInstances != null) return _resolverInstances; _resolverInstances = new List(); foreach (var typeName in customResolverTypeNames) { try { var type = Type.GetType(typeName); if (type != null && typeof(IAvrgMvvmConflictResolver).IsAssignableFrom(type)) { var instance = Activator.CreateInstance(type) as IAvrgMvvmConflictResolver; if (instance != null) _resolverInstances.Add(instance); } } catch (Exception e) { Debug.LogWarning($"[AvrgMvvmResolverConfig] 无法实例化解析器 {typeName}: {e.Message}"); } } return _resolverInstances; } /// /// 尝试按配置解决冲突 /// public bool TryResolve(AvrgMvvmBinding binding, out object resolvedValue) { // 按序尝试自定义解析器 var resolvers = GetResolverInstances(); foreach (var resolver in resolvers) { if (resolver.TryResolve(binding, defaultStrategy, out resolvedValue)) return true; } resolvedValue = null; return false; } /// /// IAvrgMvvmConflictResolver 接口实现 /// bool IAvrgMvvmConflictResolver.TryResolve( AvrgMvvmBinding binding, ConflictResolutionStrategy defaultStrategy, out object resolvedValue) { return TryResolve(binding, out resolvedValue); } } }