using System; using System.Collections.Generic; using System.Linq; namespace ShrinkModFramework { internal interface IShrinkOwnedRegistry { void RemoveOwnedEntries(string ownerModId); } public sealed class ShrinkModRegistry : IShrinkOwnedRegistry { private readonly Dictionary> _entries = new(); public string Name { get; } internal ShrinkModRegistry(string name) { if (string.IsNullOrWhiteSpace(name)) throw new ArgumentException("注册表名称不能为空。", nameof(name)); Name = name.Trim(); } public IReadOnlyCollection> Entries => _entries.Values.ToArray(); public void Register(string ownerModId, string key, T value) { if (string.IsNullOrWhiteSpace(ownerModId)) throw new ArgumentException("归属模组 ID 不能为空。", nameof(ownerModId)); if (string.IsNullOrWhiteSpace(key)) throw new ArgumentException("注册键不能为空。", nameof(key)); key = key.Trim(); if (_entries.ContainsKey(key)) throw new InvalidOperationException($"注册表 '{Name}' 中已存在键 '{key}'。"); _entries.Add(key, new ShrinkRegistryEntry(ownerModId.Trim(), key, value)); } public bool Contains(string key) => !string.IsNullOrWhiteSpace(key) && _entries.ContainsKey(key.Trim()); public bool TryGet(string key, out T value) { if (!string.IsNullOrWhiteSpace(key) && _entries.TryGetValue(key.Trim(), out var entry)) { value = entry.Value; return true; } value = default; return false; } public bool TryGetEntry(string key, out ShrinkRegistryEntry entry) { if (!string.IsNullOrWhiteSpace(key)) return _entries.TryGetValue(key.Trim(), out entry); entry = default; return false; } void IShrinkOwnedRegistry.RemoveOwnedEntries(string ownerModId) { if (string.IsNullOrWhiteSpace(ownerModId)) return; var keys = _entries .Where(pair => string.Equals(pair.Value.OwnerModId, ownerModId, StringComparison.Ordinal)) .Select(pair => pair.Key) .ToArray(); foreach (var key in keys) _entries.Remove(key); } } public readonly struct ShrinkRegistryEntry { public string OwnerModId { get; } public string Key { get; } public T Value { get; } public ShrinkRegistryEntry(string ownerModId, string key, T value) { OwnerModId = ownerModId; Key = key; Value = value; } } }