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);
}
}
}