public static ObjectData Collect(object source, CollectContext context)
        {
            if (context.Depth > MaxDepth)
            {
                throw new Exception("Object graph is too deep");
            }
            if (ReferenceEquals(source, null))
            {
                return(PrimitiveData.NullValue);
            }
            // prevents recursion
            if (context.Cache.TryGetValue(source, out var data))
            {
                return(data);
            }
            var    typeMetadata = GetTypeMetadata(source);
            string typeName     = source.GetType().FullName;

            if (typeMetadata.IsState)
            {
                return(CreateStateObject(source, typeMetadata, typeName, context));
            }
            else if (source is IDictionary dictionary)
            {
                return(CreateDictionary(dictionary, typeName, context));
            }
            else if (source is IEnumerable enumerable && !(source is string))
            {
                return(CreateListData(enumerable, typeName, context));
            }
Example #2
0
        private void AnyThresd()
        {
            Task.Run(() =>
            {
                IDFile file = null;

                while (true)
                {
                    lock (this)
                    {
                        if (_queue.Count > 0)
                        {
                            file = _queue.Dequeue();
                        }
                    }

                    if (file != null)
                    {
                        _logger.LogInformation($"开始处理 {file}");

                        using (var sr = new StreamReader(file.FullPath))
                        {
                            var line    = "";
                            var index   = 1;
                            var message = "";

                            var context = new CollectContext();

                            while ((line = sr.ReadLine()) != null)
                            {
                                if (!Regex.IsMatch(line, _options.Mulitline.Pattern))
                                {
                                    context.Fields["message"] = message;
                                    _dealContext(context);

                                    context = new CollectContext();
                                    index   = 1;
                                    message = "";

                                    context.Fields["path"]         = file.FullPath;
                                    context.Fields["basefilename"] = file.Name.Split('.')[0].ToLower();
                                }

                                line = line.TrimStart();

                                if (index <= _options.Mulitline.SpecialLines)
                                {
                                    context.Fields[$"line{index}"] = line;

                                    index++;
                                }
                                else
                                {
                                    message += line + "\r\n";
                                }

                                mre_pauseToStart.WaitOne();
                            }
                        }

                        _logger.LogInformation($"{file} 处理完成");
                    }

                    if (file == null)
                    {
                        mre_addFile.WaitOne();
                    }

                    file = null;
                }
            });
        }
 public static ObjectData Collect(object source)
 {
     return(Collect(source, CollectContext.CreateEmpty()));
 }