Add a workaround for unbinding script members on Mono

This commit is contained in:
abcdefg30
2022-10-09 13:45:44 +02:00
committed by Gustas
parent a2a34dafde
commit 02d9ba020d

View File

@@ -24,6 +24,10 @@ namespace OpenRA.Scripting
protected readonly ScriptContext Context;
readonly Dictionary<string, ScriptMemberWrapper> members = new Dictionary<string, ScriptMemberWrapper>();
#if !NET5_0_OR_GREATER
readonly List<string> membersToRemove = new List<string>();
#endif
public ScriptObjectWrapper(ScriptContext context)
{
Context = context;
@@ -63,9 +67,22 @@ namespace OpenRA.Scripting
protected void Unbind(Type targetType)
{
#if NET5_0_OR_GREATER
// NOTE: In newer versions of .NET modifying the collection by calling Remove while iterating over it is valid
foreach (var m in members)
if (targetType == m.Value.Target.GetType())
members.Remove(m.Key);
#else
// PERF: Re-use instead of allocating a new list on each unbind
membersToRemove.Clear();
foreach (var m in members)
if (targetType == m.Value.Target.GetType())
membersToRemove.Add(m.Key);
foreach (var m in membersToRemove)
members.Remove(m);
#endif
}
public bool ContainsKey(string key) { return members.ContainsKey(key); }