1- // Licensed to the .NET Foundation under one or more agreements.
1+ // Licensed to the .NET Foundation under one or more agreements.
22// The .NET Foundation licenses this file to you under the MIT license.
33
44using System ;
@@ -653,20 +653,19 @@ private void DumpTypeSpecifications(
653653
654654 _tablesContext . TypeSpecificationsTable . TryGetTypeReferenceId ( typeReference , out ushort index ) ;
655655
656- var typeSpec = new TypeSpec ( ) ;
656+ TypeSpec typeSpec = new TypeSpec ( ) ;
657657
658658 // assume that real token index is the same as ours
659659 // need to add one because ours is 0 indexed
660660 realToken = new MetadataToken ( TokenType . TypeSpec , index + 1 ) . ToUInt32 ( ) . ToString ( "X8" ) ;
661-
662661 typeSpec . ReferenceId = $ "[{ new nanoMetadataToken ( NanoClrTable . TBL_TypeSpec , index ) } ] /*{ realToken } */";
663662
664663 // build name
665664 StringBuilder typeSpecName = new StringBuilder ( ) ;
666665
667666 if ( typeReference is GenericParameter )
668667 {
669- var genericParam = typeReference as GenericParameter ;
668+ GenericParameter genericParam = typeReference as GenericParameter ;
670669
671670 typeSpecName . Append ( typeReference . MetadataType ) ;
672671
@@ -683,19 +682,19 @@ private void DumpTypeSpecifications(
683682
684683 typeSpec . Name = typeSpecName . ToString ( ) ;
685684 }
686- else if ( typeReference is GenericInstanceType )
685+ else if ( typeReference is GenericInstanceType genericInstanceType )
687686 {
688687 // type is a GenericInstance
689688 // can't compare with Cecil MetadataToken because the tables have been cleaned-up and re-indexed
690689
691690 typeSpec . Name = typeReference . FullName ;
692691
693- foreach ( var mr in _tablesContext . MethodReferencesTable . Items )
692+ foreach ( MethodReference mr in _tablesContext . MethodReferencesTable . Items )
694693 {
695694 if ( _tablesContext . TypeSpecificationsTable . TryGetTypeReferenceId ( mr . DeclaringType , out ushort referenceId ) &&
696695 referenceId == index )
697696 {
698- var memberRef = new MemberRef ( )
697+ MemberRef memberRef = new MemberRef ( )
699698 {
700699 Name = mr . Name
701700 } ;
@@ -712,12 +711,12 @@ private void DumpTypeSpecifications(
712711 }
713712 }
714713
715- foreach ( var ms in _tablesContext . MethodSpecificationTable . Items )
714+ foreach ( MethodSpecification ms in _tablesContext . MethodSpecificationTable . Items )
716715 {
717716 if ( _tablesContext . TypeSpecificationsTable . TryGetTypeReferenceId ( ms . DeclaringType , out ushort referenceId ) &&
718717 referenceId == index )
719718 {
720- var memberRef = new MemberRef ( )
719+ MemberRef memberRef = new MemberRef ( )
721720 {
722721 Name = ms . Name
723722 } ;
@@ -734,21 +733,63 @@ private void DumpTypeSpecifications(
734733 }
735734 }
736735
737- foreach ( var fr in _tablesContext . FieldReferencesTable . Items )
736+ foreach ( FieldReference fr in _tablesContext . FieldReferencesTable . Items )
738737 {
739738 if ( _tablesContext . TypeSpecificationsTable . TryGetTypeReferenceId ( fr . DeclaringType , out ushort referenceId ) &&
740739 referenceId == index )
741740 {
742- var memberRef = new MemberRef ( )
741+ MemberRef memberRef = new MemberRef ( )
743742 {
744743 Name = fr . Name
745744 } ;
745+
746746 if ( _tablesContext . FieldReferencesTable . TryGetFieldReferenceId ( fr , out ushort fieldRefId ) )
747747 {
748748 realToken = fr . MetadataToken . ToInt32 ( ) . ToString ( "X8" ) ;
749749 memberRef . ReferenceId = $ "[{ new nanoMetadataToken ( NanoClrTable . TBL_FieldRef , fieldRefId ) } ] /*{ realToken } */";
750750 memberRef . Signature = fr . FieldType . TypeSignatureAsString ( ) ;
751751 }
752+
753+ typeSpec . MemberReferences . Add ( memberRef ) ;
754+ }
755+ }
756+
757+ if ( genericInstanceType . ElementType is TypeDefinition definition )
758+ {
759+ foreach ( MethodDefinition md in definition . Methods )
760+ {
761+ // skip compiler-generated or primitive helpers if you like
762+ MemberRef memberRef = new MemberRef
763+ {
764+ Name = md . Name ,
765+ Signature = PrintSignatureForMethod ( md )
766+ } ;
767+
768+ // get the MethodDef RID from your MethodDefinitionTable
769+ if ( _tablesContext . MethodDefinitionTable . TryGetMethodReferenceId ( md , out ushort defId ) )
770+ {
771+ realToken = md . MetadataToken . ToInt32 ( ) . ToString ( "X8" ) ;
772+ memberRef . ReferenceId = $ "[{ new nanoMetadataToken ( NanoClrTable . TBL_MethodDef , defId ) } ] /*{ realToken } */";
773+ }
774+
775+ typeSpec . MemberReferences . Add ( memberRef ) ;
776+ }
777+
778+ // and similarly for fields if you want:
779+ foreach ( FieldDefinition fd in definition . Fields )
780+ {
781+ MemberRef memberRef = new MemberRef
782+ {
783+ Name = fd . Name ,
784+ Signature = fd . FieldType . TypeSignatureAsString ( )
785+ } ;
786+
787+ if ( _tablesContext . FieldsTable . TryGetFieldReferenceId ( fd , false , out ushort fieldId ) )
788+ {
789+ realToken = fd . MetadataToken . ToInt32 ( ) . ToString ( "X8" ) ;
790+ memberRef . ReferenceId = $ "[{ new nanoMetadataToken ( NanoClrTable . TBL_FieldDef , fieldId ) } ] /*{ realToken } */";
791+ }
792+
752793 typeSpec . MemberReferences . Add ( memberRef ) ;
753794 }
754795 }
0 commit comments