开发Albion Parser时遇‘已添加相同键项’错误,如何修复?
修复“已添加具有相同键的项。键: 1”错误
错误原因
你的代码在OnEvent方法中,当Code == 3时直接调用Parameters.Add(1, EventCodes.Move),但Dictionary不允许存在重复键。如果传入的Parameters字典中已经包含键为1的条目,执行Add操作就会触发这个异常。
修复方案
有两种可靠的解决方式,根据你的.NET版本选择:
方案1:使用TryAdd方法(.NET Core 3.0+ / .NET 5+)
TryAdd方法会先检查键是否存在,仅当键不存在时才添加条目,不会抛出异常:
if (Code == 3) { Parameters.TryAdd(1, EventCodes.Move); }
方案2:先检查再添加/更新(兼容所有.NET版本)
手动判断键是否存在,存在则更新值,不存在则添加:
if (Code == 3) { if (Parameters.ContainsKey(1)) { Parameters[1] = EventCodes.Move; } else { Parameters.Add(1, EventCodes.Move); } }
额外建议
如果不希望修改原始的Parameters字典(避免影响其他逻辑),可以创建一个副本再操作:
protected override void OnEvent(byte Code, Dictionary<byte, object> Parameters) { Dictionary<byte, object> targetParams = Parameters; if (Code == 3) { targetParams = new Dictionary<byte, object>(Parameters); targetParams[1] = EventCodes.Move; // 直接赋值,存在则覆盖,不存在则添加 } short eventCode = ParseEventCode(targetParams); if (eventCode == 27) { Console.Write("EventCode: " + eventCode + " ["); targetParams.ToList().ForEach(x => Console.Write(x.Key + " {" + x.Value + "::" + ObjectDumper.Dump(x.Value, 2) + "},")); Console.WriteLine("]"); } var eventPacket = new EventPacket(eventCode, targetParams); handlers.HandleAsync(eventPacket); }
内容的提问来源于stack exchange,提问作者Konrad Taylor
相关产品推荐
相关产品推荐

