1
- // Licensed to the .NET Foundation under one or more agreements.
1
+ // Licensed to the .NET Foundation under one or more agreements.
2
2
// The .NET Foundation licenses this file to you under the MIT license.
3
3
4
4
using System ;
@@ -653,20 +653,19 @@ private void DumpTypeSpecifications(
653
653
654
654
_tablesContext . TypeSpecificationsTable . TryGetTypeReferenceId ( typeReference , out ushort index ) ;
655
655
656
- var typeSpec = new TypeSpec ( ) ;
656
+ TypeSpec typeSpec = new TypeSpec ( ) ;
657
657
658
658
// assume that real token index is the same as ours
659
659
// need to add one because ours is 0 indexed
660
660
realToken = new MetadataToken ( TokenType . TypeSpec , index + 1 ) . ToUInt32 ( ) . ToString ( "X8" ) ;
661
-
662
661
typeSpec . ReferenceId = $ "[{ new nanoMetadataToken ( NanoClrTable . TBL_TypeSpec , index ) } ] /*{ realToken } */";
663
662
664
663
// build name
665
664
StringBuilder typeSpecName = new StringBuilder ( ) ;
666
665
667
666
if ( typeReference is GenericParameter )
668
667
{
669
- var genericParam = typeReference as GenericParameter ;
668
+ GenericParameter genericParam = typeReference as GenericParameter ;
670
669
671
670
typeSpecName . Append ( typeReference . MetadataType ) ;
672
671
@@ -683,19 +682,19 @@ private void DumpTypeSpecifications(
683
682
684
683
typeSpec . Name = typeSpecName . ToString ( ) ;
685
684
}
686
- else if ( typeReference is GenericInstanceType )
685
+ else if ( typeReference is GenericInstanceType genericInstanceType )
687
686
{
688
687
// type is a GenericInstance
689
688
// can't compare with Cecil MetadataToken because the tables have been cleaned-up and re-indexed
690
689
691
690
typeSpec . Name = typeReference . FullName ;
692
691
693
- foreach ( var mr in _tablesContext . MethodReferencesTable . Items )
692
+ foreach ( MethodReference mr in _tablesContext . MethodReferencesTable . Items )
694
693
{
695
694
if ( _tablesContext . TypeSpecificationsTable . TryGetTypeReferenceId ( mr . DeclaringType , out ushort referenceId ) &&
696
695
referenceId == index )
697
696
{
698
- var memberRef = new MemberRef ( )
697
+ MemberRef memberRef = new MemberRef ( )
699
698
{
700
699
Name = mr . Name
701
700
} ;
@@ -712,12 +711,12 @@ private void DumpTypeSpecifications(
712
711
}
713
712
}
714
713
715
- foreach ( var ms in _tablesContext . MethodSpecificationTable . Items )
714
+ foreach ( MethodSpecification ms in _tablesContext . MethodSpecificationTable . Items )
716
715
{
717
716
if ( _tablesContext . TypeSpecificationsTable . TryGetTypeReferenceId ( ms . DeclaringType , out ushort referenceId ) &&
718
717
referenceId == index )
719
718
{
720
- var memberRef = new MemberRef ( )
719
+ MemberRef memberRef = new MemberRef ( )
721
720
{
722
721
Name = ms . Name
723
722
} ;
@@ -734,21 +733,63 @@ private void DumpTypeSpecifications(
734
733
}
735
734
}
736
735
737
- foreach ( var fr in _tablesContext . FieldReferencesTable . Items )
736
+ foreach ( FieldReference fr in _tablesContext . FieldReferencesTable . Items )
738
737
{
739
738
if ( _tablesContext . TypeSpecificationsTable . TryGetTypeReferenceId ( fr . DeclaringType , out ushort referenceId ) &&
740
739
referenceId == index )
741
740
{
742
- var memberRef = new MemberRef ( )
741
+ MemberRef memberRef = new MemberRef ( )
743
742
{
744
743
Name = fr . Name
745
744
} ;
745
+
746
746
if ( _tablesContext . FieldReferencesTable . TryGetFieldReferenceId ( fr , out ushort fieldRefId ) )
747
747
{
748
748
realToken = fr . MetadataToken . ToInt32 ( ) . ToString ( "X8" ) ;
749
749
memberRef . ReferenceId = $ "[{ new nanoMetadataToken ( NanoClrTable . TBL_FieldRef , fieldRefId ) } ] /*{ realToken } */";
750
750
memberRef . Signature = fr . FieldType . TypeSignatureAsString ( ) ;
751
751
}
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
+
752
793
typeSpec . MemberReferences . Add ( memberRef ) ;
753
794
}
754
795
}
0 commit comments