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))); }
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));