internal FieldDefinition(MetadataHeader header, MetadataToken token, MetadataRow <ushort, uint, uint> row)
            : base(header, token, row)
        {
            var stringStream = header.GetStream <StringStream>();

            Attributes = (FieldAttributes)row.Column1;
            _name      = new LazyValue <string>(() => stringStream.GetStringByOffset(row.Column2));
            _signature = new LazyValue <FieldSignature>(() =>
                                                        FieldSignature.FromReader(header, header.GetStream <BlobStream>().CreateBlobReader(row.Column3)));
        }
Exemple #2
0
        internal FieldDefinition(MetadataImage image, MetadataRow <FieldAttributes, uint, uint> row)
            : base(row.MetadataToken)
        {
            _image     = image;
            Attributes = row.Column1;

            _name = new LazyValue <string>(() =>
                                           image.Header.GetStream <StringStream>().GetStringByOffset(row.Column2));

            _signature = new LazyValue <FieldSignature>(() =>
                                                        FieldSignature.FromReader(image, image.Header.GetStream <BlobStream>().CreateBlobReader(row.Column3), true));

            _declaringType = new LazyValue <TypeDefinition>(() =>
            {
                var table   = image.Header.GetStream <TableStream>().GetTable(MetadataTokenType.TypeDef);
                var typeRow = table.GetRowClosestToKey(4, row.MetadataToken.Rid);
                return((TypeDefinition)table.GetMemberFromRow(image, typeRow));
            });

            _constant = new LazyValue <Constant>(() =>
            {
                var table       = (ConstantTable)image.Header.GetStream <TableStream>().GetTable(MetadataTokenType.Constant);
                var constantRow = table.FindConstantOfOwner(row.MetadataToken);
                return(constantRow != null ? (Constant)table.GetMemberFromRow(image, constantRow) : null);
            });

            _fieldRva = new LazyValue <FieldRva>(() =>
            {
                var tableStream = image.Header.GetStream <TableStream>();
                var table       = (FieldRvaTable)tableStream.GetTable(MetadataTokenType.FieldRva);
                var rvaRow      = table.FindFieldRvaOfField(row.MetadataToken.Rid);
                return(rvaRow != null ? (FieldRva)table.GetMemberFromRow(image, rvaRow) : null);
            });

            _fieldMarshal = new LazyValue <FieldMarshal>(() =>
            {
                var table      = (FieldMarshalTable)image.Header.GetStream <TableStream>().GetTable(MetadataTokenType.FieldMarshal);
                var marshalRow = table.FindFieldMarshalOfOwner(row.MetadataToken);
                return(marshalRow != null ? (FieldMarshal)table.GetMemberFromRow(image, marshalRow) : null);
            });

            _fieldLayout = new LazyValue <FieldLayout>(() =>
            {
                var table     = (FieldLayoutTable)image.Header.GetStream <TableStream>().GetTable(MetadataTokenType.FieldLayout);
                var layoutRow = table.FindFieldLayoutOfOwner(row.MetadataToken);
                return(layoutRow != null ? (FieldLayout)table.GetMemberFromRow(image, layoutRow) : null);
            });

            _pinvokeMap = new LazyValue <ImplementationMap>(() =>
            {
                if (!row.Column1.HasFlag(FieldAttributes.PinvokeImpl))
                {
                    return(null);
                }

                var table  = (ImplementationMapTable)image.Header.GetStream <TableStream>().GetTable(MetadataTokenType.ImplMap);
                var mapRow = table.FindImplementationMapOfOwner(row.MetadataToken);
                return(mapRow != null ? (ImplementationMap)table.GetMemberFromRow(image, mapRow) : null);
            });

            CustomAttributes = new CustomAttributeCollection(this);
        }
 /// <inheritdoc />
 protected override FieldSignature GetSignature() => FieldSignature.FromReader(_parentModule,
                                                                               _parentModule.DotNetDirectory.Metadata
                                                                               .GetStream <BlobStream>()
                                                                               .GetBlobReaderByIndex(_row.Signature));