| File: System\Reflection\TypeLoading\Types\Ecma\EcmaDefinitionType.BindingFlags.cs | Web Access |
| Project: src\runtime\src\libraries\System.Reflection.MetadataLoadContext\src\System.Reflection.MetadataLoadContext.csproj (System.Reflection.MetadataLoadContext) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; using System.Reflection.Metadata; namespace System.Reflection.TypeLoading.Ecma { // Low level support for the BindingFlag-driven enumerator apis. These return members declared (not inherited) on the current // type, possibly doing case-sensitive/case-insensitive filtering on a supplied name. internal sealed partial class EcmaDefinitionType { // // - It may sound odd to get a non-null name filter for a constructor search, but Type.GetMember() is an api that does this. // // - All GetConstructor() apis act as if BindingFlags.DeclaredOnly were specified. So the ReflectedType will always be the declaring type and so is not passed to this method. // internal sealed override IEnumerable<ConstructorInfo> SpecializeConstructors(NameFilter? filter, RoInstantiationProviderType declaringType) { MetadataReader reader = Reader; foreach (MethodDefinitionHandle handle in TypeDefinition.GetMethods()) { MethodDefinition methodDefinition = handle.GetMethodDefinition(reader); if (filter == null || filter.Matches(methodDefinition.Name, reader)) { if (methodDefinition.IsConstructor(reader)) yield return new RoDefinitionConstructor<EcmaMethodDecoder>(declaringType, new EcmaMethodDecoder(handle, GetEcmaModule())); } } } internal sealed override IEnumerable<MethodInfo> SpecializeMethods(NameFilter? filter, Type reflectedType, RoInstantiationProviderType declaringType) { MetadataReader reader = Reader; foreach (MethodDefinitionHandle handle in TypeDefinition.GetMethods()) { MethodDefinition methodDefinition = handle.GetMethodDefinition(reader); if (filter == null || filter.Matches(methodDefinition.Name, reader)) { if (!methodDefinition.IsConstructor(reader)) yield return new RoDefinitionMethod<EcmaMethodDecoder>(declaringType, reflectedType, new EcmaMethodDecoder(handle, GetEcmaModule())); } } } internal sealed override IEnumerable<EventInfo> SpecializeEvents(NameFilter? filter, Type reflectedType, RoInstantiationProviderType declaringType) { MetadataReader reader = Reader; foreach (EventDefinitionHandle handle in TypeDefinition.GetEvents()) { if (filter == null || filter.Matches(handle.GetEventDefinition(reader).Name, reader)) yield return new EcmaEvent(declaringType, handle, reflectedType); } } internal sealed override IEnumerable<FieldInfo> SpecializeFields(NameFilter? filter, Type reflectedType, RoInstantiationProviderType declaringType) { MetadataReader reader = Reader; foreach (FieldDefinitionHandle handle in TypeDefinition.GetFields()) { if (filter == null || filter.Matches(handle.GetFieldDefinition(reader).Name, reader)) yield return new EcmaField(declaringType, handle, reflectedType); } } internal sealed override IEnumerable<PropertyInfo> SpecializeProperties(NameFilter? filter, Type reflectedType, RoInstantiationProviderType declaringType) { MetadataReader reader = Reader; foreach (PropertyDefinitionHandle handle in TypeDefinition.GetProperties()) { if (filter == null || filter.Matches(handle.GetPropertyDefinition(reader).Name, reader)) yield return new EcmaProperty(declaringType, handle, reflectedType); } } internal sealed override IEnumerable<RoType> GetNestedTypesCore(NameFilter? filter) { MetadataReader reader = Reader; foreach (TypeDefinitionHandle handle in TypeDefinition.GetNestedTypes()) { TypeDefinition nestedTypeDefinition = handle.GetTypeDefinition(reader); if (filter == null || filter.Matches(nestedTypeDefinition.Name, reader)) yield return handle.ResolveTypeDef(GetEcmaModule()); } } internal sealed override RoDefinitionType? GetNestedTypeCore(ReadOnlySpan<byte> utf8Name) { RoDefinitionType? match = null; MetadataReader reader = Reader; foreach (TypeDefinitionHandle handle in TypeDefinition.GetNestedTypes()) { TypeDefinition nestedTypeDefinition = handle.GetTypeDefinition(reader); if (nestedTypeDefinition.Name.Equals(utf8Name, reader)) { if (match != null) throw ThrowHelper.GetAmbiguousMatchException(match); match = handle.ResolveTypeDef(GetEcmaModule()); } } return match; } } }