@@ -212,6 +212,15 @@ public override IEnumerable<IExtractionProduct> Contents
212212 var @base = ( Type ) Cx . CreateGeneric ( this , td . BaseType ) ;
213213 yield return @base ;
214214 yield return Tuples . cil_base_class ( this , @base ) ;
215+
216+ if ( IsSystemEnum ( td . BaseType ) &&
217+ GetUnderlyingEnumType ( ) is var underlying &&
218+ underlying . HasValue )
219+ {
220+ var underlyingType = Cx . Create ( underlying . Value ) ;
221+ yield return underlyingType ;
222+ yield return Tuples . cil_enum_underlying_type ( this , underlyingType ) ;
223+ }
215224 }
216225
217226 foreach ( var @interface in td . GetInterfaceImplementations ( ) . Select ( i => Cx . MdReader . GetInterfaceImplementation ( i ) ) )
@@ -226,6 +235,59 @@ public override IEnumerable<IExtractionProduct> Contents
226235 }
227236 }
228237
238+ private bool IsSystemEnum ( EntityHandle baseType )
239+ {
240+ return baseType . Kind switch
241+ {
242+ HandleKind . TypeReference => IsSystemEnum ( ( TypeReferenceHandle ) baseType ) ,
243+ HandleKind . TypeDefinition => IsSystemEnum ( ( TypeDefinitionHandle ) baseType ) ,
244+ _ => false ,
245+ } ;
246+ }
247+
248+ private bool IsSystemEnum ( TypeReferenceHandle baseType )
249+ {
250+ var baseTypeReference = Cx . MdReader . GetTypeReference ( baseType ) ;
251+
252+ return IsSystemEnum ( baseTypeReference . Name , baseTypeReference . Namespace ) ;
253+ }
254+
255+ private bool IsSystemEnum ( TypeDefinitionHandle baseType )
256+ {
257+ var baseTypeDefinition = Cx . MdReader . GetTypeDefinition ( baseType ) ;
258+
259+ return IsSystemEnum ( baseTypeDefinition . Name , baseTypeDefinition . Namespace ) ;
260+ }
261+
262+ private bool IsSystemEnum ( StringHandle typeName , StringHandle namespaceName )
263+ {
264+ return Cx . MdReader . StringComparer . Equals ( typeName , "Enum" ) &&
265+ ! namespaceName . IsNil &&
266+ Cx . MdReader . StringComparer . Equals ( namespaceName , "System" ) ;
267+ }
268+
269+ internal PrimitiveTypeCode ? GetUnderlyingEnumType ( )
270+ {
271+ foreach ( var handle in td . GetFields ( ) )
272+ {
273+ var field = Cx . MdReader . GetFieldDefinition ( handle ) ;
274+ if ( field . Attributes . HasFlag ( FieldAttributes . Static ) )
275+ {
276+ continue ;
277+ }
278+
279+ var blob = Cx . MdReader . GetBlobReader ( field . Signature ) ;
280+ if ( blob . ReadSignatureHeader ( ) . Kind != SignatureKind . Field )
281+ {
282+ break ;
283+ }
284+
285+ return ( PrimitiveTypeCode ) blob . ReadByte ( ) ;
286+ }
287+
288+ return null ;
289+ }
290+
229291 internal override Method LookupMethod ( StringHandle name , BlobHandle signature )
230292 {
231293 foreach ( var h in td . GetMethods ( ) )
0 commit comments