DefaultReferenceResolver
using Newtonsoft.Json.Utilities;
using System.Globalization;
using System.Runtime.CompilerServices;
namespace Newtonsoft.Json.Serialization
{
    [System.Runtime.CompilerServices.NullableContext(1)]
    [System.Runtime.CompilerServices.Nullable(0)]
    internal class DefaultReferenceResolver : IReferenceResolver
    {
        private int _referenceCount;
        private BidirectionalDictionary<string, object> GetMappings(object context)
        {
            JsonSerializerInternalBase jsonSerializerInternalBase = context as JsonSerializerInternalBase;
            if (jsonSerializerInternalBase == null) {
                JsonSerializerProxy jsonSerializerProxy = context as JsonSerializerProxy;
                if (jsonSerializerProxy == null)
                    throw new JsonException("The DefaultReferenceResolver can only be used internally.");
                jsonSerializerInternalBase = jsonSerializerProxy.GetInternalSerializer();
            }
            return jsonSerializerInternalBase.DefaultReferenceMappings;
        }
        public object ResolveReference(object context, string reference)
        {
            GetMappings(context).TryGetByFirst(reference, out object second);
            return second;
        }
        public string GetReference(object context, object value)
        {
            BidirectionalDictionary<string, object> mappings = GetMappings(context);
            if (!mappings.TryGetBySecond(value, out string first)) {
                _referenceCount++;
                first = _referenceCount.ToString(CultureInfo.InvariantCulture);
                mappings.Set(first, value);
            }
            return first;
        }
        public void AddReference(object context, string reference, object value)
        {
            GetMappings(context).Set(reference, value);
        }
        public bool IsReferenced(object context, object value)
        {
            string first;
            return GetMappings(context).TryGetBySecond(value, out first);
        }
    }
}