Stream(ArrayList data, ExtensibleStorageField storageField)
        {
            Field  field  = storageField.Field;
            Entity entity = storageField.Entity;

            data.Add(new Snoop.Data.ClassSeparator(typeof(Field)));
            data.Add(new Snoop.Data.String("Container Type", field.ContainerType.ToString()));
            data.Add(new Snoop.Data.String("Documentation", field.Documentation));
            if (field.KeyType != null)
            {
                data.Add(new Snoop.Data.String("Key Type", field.KeyType.ToString()));
            }
            data.Add(new Snoop.Data.String("Value Type", field.ValueType.ToString()));
            data.Add(new Snoop.Data.String("Unit Type", field.UnitType.ToString()));

            Schema schema = field.Schema;

            if (schema != null)
            {
                data.Add(new Snoop.Data.Object("Schema", schema));

                Object          value = null;
                DisplayUnitType dut   = DisplayUnitType.DUT_UNDEFINED;

                Type[] typeParameters = new Type[2] {
                    typeof(Field),
                    typeof(Autodesk.Revit.DB.DisplayUnitType)
                };
                MethodInfo methodInfo = typeof(Entity).GetMethod("Get", typeParameters);

                // try to get a valid display unit type here.
                if (field.UnitType != UnitType.UT_Undefined)
                {
                    dut = m_activeDoc.GetUnits().GetFormatOptions(field.UnitType).DisplayUnits;
                }

                switch (field.ContainerType)
                {
                case ContainerType.Simple:
                {
                    //MethodInfo genericGet = methodInfo.MakeGenericMethod(field.ValueType);
                    MethodInfo genericGet = methodInfo.MakeGenericMethod(new Type[] { field.ValueType });
                    Object[]   parameters = new Object[2] {
                        field, dut
                    };
                    value = genericGet.Invoke(entity, parameters);
                    break;
                }

                case ContainerType.Array:
                {
                    String typeName = typeof(IList <int>).AssemblyQualifiedName.Replace(typeof(int).AssemblyQualifiedName,
                                                                                        field.ValueType.AssemblyQualifiedName);
                    Type type = Type.GetType(typeName);
                    //MethodInfo genericGet = methodInfo.MakeGenericMethod(type);
                    MethodInfo genericGet = methodInfo.MakeGenericMethod(new Type[] { type });
                    Object[]   parameters = new Object[2] {
                        field, dut
                    };
                    value = genericGet.Invoke(entity, parameters);
                    break;
                }

                case ContainerType.Map:
                {
                    //String typeName = typeof(IDictionary<int, double>).AssemblyQualifiedName.Replace(
                    //  typeof(int).AssemblyQualifiedName, field.KeyType.ToString()).Replace(
                    //  typeof(double).AssemblyQualifiedName, field.ValueType.ToString());
                    String typeName = typeof(IDictionary <int, double>).AssemblyQualifiedName.Replace(
                        typeof(int).AssemblyQualifiedName, field.KeyType.AssemblyQualifiedName).Replace(
                        typeof(double).AssemblyQualifiedName, field.ValueType.AssemblyQualifiedName);
                    Type type = Type.GetType(typeName);
                    //MethodInfo genericGet = methodInfo.MakeGenericMethod(type);
                    MethodInfo genericGet = methodInfo.MakeGenericMethod(new Type[] { type });
                    Object[]   parameters = new Object[2] {
                        field, dut
                    };
                    value = genericGet.Invoke(entity, parameters);
                    break;
                }

                default:
                    break;
                }
                data.Add(new Snoop.Data.String("Display Unit Type", dut.ToString()));
                Utils.AppendThePropertyObject(data, field.FieldName, value);
            }
        }
        CollectEvent(object sender, CollectorEventArgs e)
        {
            // cast the sender object to the SnoopCollector we are expecting
            Collector snoopCollector = sender as Collector;

            if (snoopCollector == null)
            {
                Debug.Assert(false); // why did someone else send us the message?
                return;
            }

            // see if it is a type we are responsible for
            Color color = e.ObjToSnoop as Color;

            if (color != null)
            {
                Stream(snoopCollector.Data(), color);
                return;
            }

            LayoutRule layoutRule = e.ObjToSnoop as LayoutRule;

            if (layoutRule != null)
            {
                Stream(snoopCollector.Data(), layoutRule);
                return;
            }

            FormatOptions formatOptions = e.ObjToSnoop as FormatOptions;

            if (formatOptions != null)
            {
                Stream(snoopCollector.Data(), formatOptions);
                return;
            }

            CurtainGrid curtainGrid = e.ObjToSnoop as CurtainGrid;

            if (curtainGrid != null)
            {
                Stream(snoopCollector.Data(), curtainGrid);
                return;
            }

            CurtainCell curtainCell = e.ObjToSnoop as CurtainCell;

            if (curtainCell != null)
            {
                Stream(snoopCollector.Data(), curtainCell);
                return;
            }

            RebarHostData rebarHostData = e.ObjToSnoop as RebarHostData;

            if (rebarHostData != null)
            {
                Stream(snoopCollector.Data(), rebarHostData);
                return;
            }

            Leader leader = e.ObjToSnoop as Leader;

            if (leader != null)
            {
                Stream(snoopCollector.Data(), leader);
                return;
            }

            AreaVolumeSettings areaSettings = e.ObjToSnoop as AreaVolumeSettings;

            if (areaSettings != null)
            {
                Stream(snoopCollector.Data(), areaSettings);
                return;
            }

            ViewSheetSetting viewSheetSetting = e.ObjToSnoop as ViewSheetSetting;

            if (viewSheetSetting != null)
            {
                Stream(snoopCollector.Data(), viewSheetSetting);
                return;
            }

            Autodesk.Revit.UI.Events.DialogBoxData dlgBoxData = e.ObjToSnoop as Autodesk.Revit.UI.Events.DialogBoxData;
            if (dlgBoxData != null)
            {
                Stream(snoopCollector.Data(), dlgBoxData);
                return;
            }

            Construction construct = e.ObjToSnoop as Construction;

            if (construct != null)
            {
                Stream(snoopCollector.Data(), construct);
                return;
            }

            FamilyElementVisibility famElemVisib = e.ObjToSnoop as FamilyElementVisibility;

            if (famElemVisib != null)
            {
                Stream(snoopCollector.Data(), famElemVisib);
                return;
            }

            FamilyManager famManager = e.ObjToSnoop as FamilyManager;

            if (famManager != null)
            {
                Stream(snoopCollector.Data(), famManager);
                return;
            }

            FamilyParameter famParam = e.ObjToSnoop as FamilyParameter;

            if (famParam != null)
            {
                Stream(snoopCollector.Data(), famParam);
                return;
            }

            FamilyType famType = e.ObjToSnoop as FamilyType;

            if (famType != null)
            {
                Stream(snoopCollector.Data(), famType);
                return;
            }

            MEPSpaceConstruction mepSpaceConstuct = e.ObjToSnoop as MEPSpaceConstruction;

            if (mepSpaceConstuct != null)
            {
                Stream(snoopCollector.Data(), mepSpaceConstuct);
                return;
            }

            BuildingSiteExportOptions bldSiteExpOptions = e.ObjToSnoop as BuildingSiteExportOptions;

            if (bldSiteExpOptions != null)
            {
                Stream(snoopCollector.Data(), bldSiteExpOptions);
                return;
            }

            DGNExportOptions dgnExpOptions = e.ObjToSnoop as DGNExportOptions;

            if (dgnExpOptions != null)
            {
                Stream(snoopCollector.Data(), dgnExpOptions);
                return;
            }

            DWFExportOptions dwfExpOptions = e.ObjToSnoop as DWFExportOptions;

            if (dwfExpOptions != null)
            {
                Stream(snoopCollector.Data(), dwfExpOptions);
                return;
            }

            DWGExportOptions dwgExpOptions = e.ObjToSnoop as DWGExportOptions;

            if (dwgExpOptions != null)
            {
                Stream(snoopCollector.Data(), dwgExpOptions);
                return;
            }

            DWGImportOptions dwgImpOptions = e.ObjToSnoop as DWGImportOptions;

            if (dwgImpOptions != null)
            {
                Stream(snoopCollector.Data(), dwgImpOptions);
                return;
            }

            FBXExportOptions fbxExpOptions = e.ObjToSnoop as FBXExportOptions;

            if (fbxExpOptions != null)
            {
                Stream(snoopCollector.Data(), fbxExpOptions);
                return;
            }

            TrussMemberInfo trussInfo = e.ObjToSnoop as TrussMemberInfo;

            if (trussInfo != null)
            {
                Stream(snoopCollector.Data(), trussInfo);
                return;
            }

            VertexIndexPair vertIndPair = e.ObjToSnoop as VertexIndexPair;

            if (vertIndPair != null)
            {
                Stream(snoopCollector.Data(), vertIndPair);
                return;
            }

            PointElementReference ptElemRef = e.ObjToSnoop as PointElementReference;

            if (ptElemRef != null)
            {
                Stream(snoopCollector.Data(), ptElemRef);
                return;
            }

            Autodesk.Revit.DB.Architecture.BoundarySegment boundSeg = e.ObjToSnoop as Autodesk.Revit.DB.Architecture.BoundarySegment;
            if (boundSeg != null)
            {
                Stream(snoopCollector.Data(), boundSeg);
                return;
            }

            PointLocationOnCurve ptLocOnCurve = e.ObjToSnoop as PointLocationOnCurve;

            if (ptLocOnCurve != null)
            {
                Stream(snoopCollector.Data(), ptLocOnCurve);
                return;
            }

            Entity entity = e.ObjToSnoop as Entity;

            if (entity != null)
            {
                Stream(snoopCollector.Data(), entity);
                return;
            }

            Field field = e.ObjToSnoop as Field;

            if (field != null)
            {
                Stream(snoopCollector.Data(), field);
                return;
            }

            ExtensibleStorageField storeagefield = e.ObjToSnoop as ExtensibleStorageField;

            if (storeagefield != null)
            {
                Stream(snoopCollector.Data(), storeagefield);
                return;
            }

            IList <Autodesk.Revit.DB.BoundarySegment> boundSegs = e.ObjToSnoop as
                                                                  IList <Autodesk.Revit.DB.BoundarySegment>;

            if (boundSegs != null)
            {
                Stream(snoopCollector.Data(), boundSegs);
                return;
            }

            if (e.ObjToSnoop is KeyValuePair <String, String> )
            {
                KeyValuePair <String, String> stringspair = (KeyValuePair <String, String>)e.ObjToSnoop;
                Stream(snoopCollector.Data(), stringspair);
                return;
            }

            Schema schema = e.ObjToSnoop as Schema;

            if (schema != null)
            {
                Stream(snoopCollector.Data(), schema);
                return;
            }

            ElementId elemId = e.ObjToSnoop as ElementId;

            if (elemId != null)
            {
                Stream(snoopCollector.Data(), elemId);
                return;
            }

            PlanViewRange plvr = e.ObjToSnoop as PlanViewRange;

            if (plvr != null)
            {
                Stream(snoopCollector.Data(), plvr);
                return;
            }
            //TF
            RebarConstraintsManager rbcm = e.ObjToSnoop as RebarConstraintsManager;

            if (rbcm != null)
            {
                Stream(snoopCollector.Data(), rbcm);
                return;
            }

            RebarConstrainedHandle rbch = e.ObjToSnoop as RebarConstrainedHandle;

            if (rbch != null)
            {
                Stream(snoopCollector.Data(), rbch);
                return;
            }

            RebarConstraint rbc = e.ObjToSnoop as RebarConstraint;

            if (rbc != null)
            {
                Stream(snoopCollector.Data(), rbc);
                return;
            }

            //TFEND

            if (Utils.IsSupportedType(e.ObjToSnoop) && e.ObjToSnoop != null)
            {
                Utils.StreamWithReflection(snoopCollector.Data(), e.ObjToSnoop.GetType(), e.ObjToSnoop);
            }
        }
      Stream(ArrayList data, ExtensibleStorageField storageField)
      {
         Field field = storageField.Field;
         Entity entity = storageField.Entity;
         data.Add(new Snoop.Data.ClassSeparator(typeof(Field)));
         data.Add(new Snoop.Data.String("Container Type", field.ContainerType.ToString()));
         data.Add(new Snoop.Data.String("Documentation", field.Documentation));
         if(field.KeyType != null)
            data.Add(new Snoop.Data.String("Key Type", field.KeyType.ToString()));
         data.Add(new Snoop.Data.String("Value Type", field.ValueType.ToString()));
         data.Add(new Snoop.Data.String("Unit Type", field.UnitType.ToString()));

         Schema schema = field.Schema;
         if (schema != null)
         {
            data.Add(new Snoop.Data.Object("Schema", schema));

            Object value = null;
            DisplayUnitType dut = DisplayUnitType.DUT_UNDEFINED;
            
            Type[] typeParameters = new Type[2] { typeof(Field), 
                  typeof(Autodesk.Revit.DB.DisplayUnitType)};
            MethodInfo methodInfo = typeof(Entity).GetMethod("Get", typeParameters);

            // try to get a valid display unit type here.
            if (field.UnitType != UnitType.UT_Undefined)
               dut = m_activeDoc.GetUnits().GetFormatOptions(field.UnitType).DisplayUnits;

            switch (field.ContainerType)
            {

                case ContainerType.Simple:
                    {

                        //MethodInfo genericGet = methodInfo.MakeGenericMethod(field.ValueType);
                        MethodInfo genericGet = methodInfo.MakeGenericMethod(new Type[] { field.ValueType });
                        Object[] parameters = new Object[2] { field, dut };
                        value = genericGet.Invoke(entity, parameters);
                        break;
                    }
                case ContainerType.Array:
                    {
                        String typeName = typeof(IList<int>).AssemblyQualifiedName.Replace(typeof(int).AssemblyQualifiedName,
                          field.ValueType.AssemblyQualifiedName);
                        Type type = Type.GetType(typeName);
                        //MethodInfo genericGet = methodInfo.MakeGenericMethod(type);
                        MethodInfo genericGet = methodInfo.MakeGenericMethod(new Type[] { type });
                        Object[] parameters = new Object[2] { field, dut };
                        value = genericGet.Invoke(entity, parameters);
                        break;
                    }
                case ContainerType.Map:
                    {
                        //String typeName = typeof(IDictionary<int, double>).AssemblyQualifiedName.Replace(
                        //  typeof(int).AssemblyQualifiedName, field.KeyType.ToString()).Replace(
                        //  typeof(double).AssemblyQualifiedName, field.ValueType.ToString());
                        String typeName = typeof(IDictionary<int, double>).AssemblyQualifiedName.Replace(
                          typeof(int).AssemblyQualifiedName, field.KeyType.AssemblyQualifiedName).Replace(
                          typeof(double).AssemblyQualifiedName, field.ValueType.AssemblyQualifiedName);
                        Type type = Type.GetType(typeName);
                        //MethodInfo genericGet = methodInfo.MakeGenericMethod(type);
                        MethodInfo genericGet = methodInfo.MakeGenericMethod(new Type[] { type });
                        Object[] parameters = new Object[2] { field, dut };
                        value = genericGet.Invoke(entity, parameters);
                        break;
                    }
                default:
                    break;
            }
            data.Add(new Snoop.Data.String("Display Unit Type", dut.ToString()));
            Utils.AppendThePropertyObject(data, field.FieldName, value);
         }

      }