<PackageReference Include="Microsoft.CSharp" Version="4.7.0-preview2.19523.17" />

BinderEquivalence

static class BinderEquivalence
using System.Collections.Concurrent; using System.Collections.Generic; using System.Threading; namespace Microsoft.CSharp.RuntimeBinder { internal static class BinderEquivalence { internal class BinderEqualityComparer : IEqualityComparer<ICSharpBinder> { public bool Equals(ICSharpBinder x, ICSharpBinder y) { return x.IsEquivalentTo(y); } public int GetHashCode(ICSharpBinder obj) { return obj.GetGetBinderEquivalenceHash(); } } private static int cachedBinderCount; private static readonly ConcurrentDictionary<ICSharpBinder, ICSharpBinder> binderEquivalenceCache = new ConcurrentDictionary<ICSharpBinder, ICSharpBinder>(2, 32, new BinderEqualityComparer()); internal static T TryGetExisting<T>(this T binder) where T : ICSharpBinder { ICSharpBinder orAdd = binderEquivalenceCache.GetOrAdd((ICSharpBinder)(object)binder, (ICSharpBinder)(object)binder); if (orAdd == (object)binder) { int num = Interlocked.Increment(ref cachedBinderCount); if ((uint)num > 4096) { binderEquivalenceCache.Clear(); cachedBinderCount = 0; } } return (T)orAdd; } } }