Files
2026-07-23 15:56:29 +08:00

89 lines
3.2 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using UnityEngine;
namespace XericUI.ReflectionUIGenerator
{
/// <summary>
/// 可配置的冲突解决器 ScriptableObject
/// 预配置各种冲突场景下的决策方法,以及可注册的自定义解析器列表
/// </summary>
[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
{
/// <summary>全局默认冲突解决策略</summary>
[Tooltip("全局默认冲突解决策略")]
public ConflictResolutionStrategy defaultStrategy = ConflictResolutionStrategy.PreferUI;
/// <summary>自定义解析器列表(按序尝试)</summary>
[Tooltip("自定义解析器类型全名列表(按序尝试,需实现 IAvrgMvvmConflictResolver")]
public List<string> customResolverTypeNames = new List<string>();
// 运行时已实例化的解析器缓存
[NonSerialized]
private List<IAvrgMvvmConflictResolver> _resolverInstances;
/// <summary>
/// 获取或实例化自定义解析器
/// </summary>
private List<IAvrgMvvmConflictResolver> GetResolverInstances()
{
if (_resolverInstances != null)
return _resolverInstances;
_resolverInstances = new List<IAvrgMvvmConflictResolver>();
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;
}
/// <summary>
/// 尝试按配置解决冲突
/// </summary>
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;
}
/// <summary>
/// IAvrgMvvmConflictResolver 接口实现
/// </summary>
bool IAvrgMvvmConflictResolver.TryResolve(
AvrgMvvmBinding binding,
ConflictResolutionStrategy defaultStrategy,
out object resolvedValue)
{
return TryResolve(binding, out resolvedValue);
}
}
}