Exemplo n.º 1
0
        private void LoadTypes()
        {
            m_allTypes = new LiftedList <TypeDefinition>(
                MetadataTable.TypeDef.RowCount(m_peFile),
                index => m_peFile.GetRow(new ZeroBasedIndex(index), MetadataTable.TypeDef),
                pRow => new TypeDefinition((TypeDefRow *)pRow, this),
                () => m_peFile.IsDisposed
                );

            var nestedTypes = new LiftedValueTypeList <NestedTypeInfo>(
                MetadataTable.NestedClass.RowCount(m_peFile),
                index => m_peFile.GetRow(new ZeroBasedIndex(index), MetadataTable.NestedClass),
                x => {
                var pRow = (NestedClassRow *)x;
                return(new NestedTypeInfo(
                           m_allTypes[((ZeroBasedIndex)(pRow->GetNestedClass(m_peFile))).Value],
                           m_allTypes[((ZeroBasedIndex)(pRow->GetEnclosingClass(m_peFile))).Value]
                           ));
            },
                () => m_peFile.IsDisposed
                );

            var enclosingTypes = nestedTypes.Select(x => x.NestedType.DeclaringType = x.EnclosingType).ToHashSet();

            m_allTypes.GroupBy(x => x.DeclaringType).ForEach(
                x => (x.Key ?? (IMutableTypeContainer)this).Types = x.ToList().AsReadOnly()
                );
            m_allTypes.Where(
                x => !enclosingTypes.Contains(x)
                ).ForEach(
                (IMutableTypeContainer x) => x.Types = new List <TypeDefinition>().AsReadOnly()
                );
        }
Exemplo n.º 2
0
        private void LoadTypes()
        {
            m_allTypes = new LiftedList<TypeDefinition>(
                MetadataTable.TypeDef.RowCount(m_peFile),
                index => m_peFile.GetRow(new ZeroBasedIndex(index), MetadataTable.TypeDef),
                pRow => new TypeDefinition((TypeDefRow*)pRow, this),
                () => m_peFile.IsDisposed
            );

            var nestedTypes = new LiftedValueTypeList<NestedTypeInfo>(
                MetadataTable.NestedClass.RowCount(m_peFile),
                index=>m_peFile.GetRow(new ZeroBasedIndex(index), MetadataTable.NestedClass),
                x=> {
                    var pRow = (NestedClassRow*) x;
                    return new NestedTypeInfo(
                        m_allTypes[((ZeroBasedIndex)(pRow->GetNestedClass(m_peFile))).Value],
                        m_allTypes[((ZeroBasedIndex)(pRow->GetEnclosingClass(m_peFile))).Value]
                    );
                },
                ()=>m_peFile.IsDisposed
            );

            var enclosingTypes = nestedTypes.Select(x => x.NestedType.DeclaringType = x.EnclosingType).ToHashSet();
            m_allTypes.GroupBy(x => x.DeclaringType).ForEach(
                x => (x.Key ?? (IMutableTypeContainer)this).Types = x.ToList().AsReadOnly()
            );
            m_allTypes.Where(
                x => !enclosingTypes.Contains(x)
            ).ForEach(
                (IMutableTypeContainer x) => x.Types = new List<TypeDefinition>().AsReadOnly()
            );
        }