internal static TraceLoggingTypeInfo <DataType> GetInstance(List <Type> recursionCheck)
        {
            if (instance == null)
            {
                var recursionCheckCount = recursionCheck.Count;
                var newInstance         = Statics.CreateDefaultTypeInfo <DataType>(recursionCheck);
                Interlocked.CompareExchange(ref instance, newInstance, null);
                recursionCheck.RemoveRange(recursionCheckCount, recursionCheck.Count - recursionCheckCount);
            }

            return(instance);
        }
        public static TraceLoggingTypeInfo GetInstance(Type type, List <Type>?recursionCheck)
        {
            Dictionary <Type, TraceLoggingTypeInfo> cache = threadCache ??= new Dictionary <Type, TraceLoggingTypeInfo>();

            if (!cache.TryGetValue(type, out TraceLoggingTypeInfo? instance))
            {
                recursionCheck ??= new List <Type>();
                int recursionCheckCount = recursionCheck.Count;
                instance    = Statics.CreateDefaultTypeInfo(type, recursionCheck);
                cache[type] = instance;
                recursionCheck.RemoveRange(recursionCheckCount, recursionCheck.Count - recursionCheckCount);
            }
            return(instance);
        }
        public static TraceLoggingTypeInfo GetInstance(Type type, List <Type> recursionCheck)
        {
            var cache = threadCache ?? (threadCache = new Dictionary <Type, TraceLoggingTypeInfo>());

            TraceLoggingTypeInfo instance;

            if (!cache.TryGetValue(type, out instance))
            {
                if (recursionCheck == null)
                {
                    recursionCheck = new List <Type>();
                }
                var recursionCheckCount = recursionCheck.Count;
                instance    = Statics.CreateDefaultTypeInfo(type, recursionCheck);
                cache[type] = instance;
                recursionCheck.RemoveRange(recursionCheckCount, recursionCheck.Count - recursionCheckCount);
            }
            return(instance);
        }