Поделиться через


Type.FindMembers(MemberTypes, BindingFlags, MemberFilter, Object) Метод

Определение

Возвращает отфильтрованный массив MemberInfo объектов указанного типа элемента.

public:
 virtual cli::array <System::Reflection::MemberInfo ^> ^ FindMembers(System::Reflection::MemberTypes memberType, System::Reflection::BindingFlags bindingAttr, System::Reflection::MemberFilter ^ filter, System::Object ^ filterCriteria);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicEvents | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicNestedTypes | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicEvents | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicNestedTypes | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)]
public virtual System.Reflection.MemberInfo[] FindMembers(System.Reflection.MemberTypes memberType, System.Reflection.BindingFlags bindingAttr, System.Reflection.MemberFilter? filter, object? filterCriteria);
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)]
public virtual System.Reflection.MemberInfo[] FindMembers(System.Reflection.MemberTypes memberType, System.Reflection.BindingFlags bindingAttr, System.Reflection.MemberFilter? filter, object? filterCriteria);
public virtual System.Reflection.MemberInfo[] FindMembers(System.Reflection.MemberTypes memberType, System.Reflection.BindingFlags bindingAttr, System.Reflection.MemberFilter filter, object filterCriteria);
public virtual System.Reflection.MemberInfo[] FindMembers(System.Reflection.MemberTypes memberType, System.Reflection.BindingFlags bindingAttr, System.Reflection.MemberFilter? filter, object? filterCriteria);
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicEvents | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicNestedTypes | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.NonPublicProperties | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicConstructors | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicEvents | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicFields | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicMethods | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicNestedTypes | System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.PublicProperties)>]
abstract member FindMembers : System.Reflection.MemberTypes * System.Reflection.BindingFlags * System.Reflection.MemberFilter * obj -> System.Reflection.MemberInfo[]
override this.FindMembers : System.Reflection.MemberTypes * System.Reflection.BindingFlags * System.Reflection.MemberFilter * obj -> System.Reflection.MemberInfo[]
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(System.Diagnostics.CodeAnalysis.DynamicallyAccessedMemberTypes.All)>]
abstract member FindMembers : System.Reflection.MemberTypes * System.Reflection.BindingFlags * System.Reflection.MemberFilter * obj -> System.Reflection.MemberInfo[]
override this.FindMembers : System.Reflection.MemberTypes * System.Reflection.BindingFlags * System.Reflection.MemberFilter * obj -> System.Reflection.MemberInfo[]
abstract member FindMembers : System.Reflection.MemberTypes * System.Reflection.BindingFlags * System.Reflection.MemberFilter * obj -> System.Reflection.MemberInfo[]
override this.FindMembers : System.Reflection.MemberTypes * System.Reflection.BindingFlags * System.Reflection.MemberFilter * obj -> System.Reflection.MemberInfo[]
Public Overridable Function FindMembers (memberType As MemberTypes, bindingAttr As BindingFlags, filter As MemberFilter, filterCriteria As Object) As MemberInfo()

Параметры

memberType
MemberTypes

Побитовое сочетание значений перечисления, указывающее тип элемента для поиска.

bindingAttr
BindingFlags

Побитовое сочетание значений перечисления, указывающее, как выполняется поиск.

–или–

значение a

filter
MemberFilter

Делегат, который выполняет сравнения, возвращая true , если в данный момент проверяемый элемент соответствует filterCriteria и false в противном случае.

filterCriteria
Object

Критерии поиска, определяющие, возвращается ли элемент в массиве MemberInfo объектов.

Поля FieldAttributes, MethodAttributesа MethodImplAttributes также могут использоваться в сочетании с делегатом FilterAttribute , предоставленным этим классом.

Возвращаемое значение

Отфильтрованный массив MemberInfo объектов указанного типа элемента.

–или–

Пустой массив, если текущий Type элемент не имеет элементов типа memberType , которые соответствуют критериям фильтра.

Реализации

Атрибуты

Исключения

filter равно null.

Примеры

В следующем примере отображаются все члены класса, соответствующие заданным критериям поиска, а затем отображаются соответствующие элементы.

using System;
using System.Reflection;

class MyFindMembersClass
{
    public static void Main()
    {
        Object objTest = new Object();
        Type objType = objTest.GetType ();
        MemberInfo[] arrayMemberInfo;
        try
        {
            //Find all static or public methods in the Object class that match the specified name.
            arrayMemberInfo = objType.FindMembers(MemberTypes.Method,
                BindingFlags.Public | BindingFlags.Static| BindingFlags.Instance,
                new MemberFilter(DelegateToSearchCriteria),
                "ReferenceEquals");

            for(int index=0;index < arrayMemberInfo.Length ;index++)
                Console.WriteLine ("Result of FindMembers -\t"+ arrayMemberInfo[index].ToString() +"\n");
        }
        catch (Exception e)
        {
            Console.WriteLine ("Exception : " + e.ToString() );
        }
    }
    public static bool DelegateToSearchCriteria(MemberInfo objMemberInfo, Object objSearch)
    {
        // Compare the name of the member function with the filter criteria.
        if(objMemberInfo.Name.ToString() == objSearch.ToString())
            return true;
        else
            return false;
    }
}
/* The example produces the following output:

Result of FindMembers - Boolean ReferenceEquals(System.Object, System.Object)
*/
open System.Reflection

let delegateToSearchCriteria (objMemberInfo: MemberInfo) (objSearch: obj) =
    // Compare the name of the member function with the filter criteria.
    string objMemberInfo.Name = string objSearch

let objTest = obj ()
let objType = objTest.GetType ()
try
    //Find all static or public methods in the Object class that match the specified name.
    let arrayMemberInfo = 
        objType.FindMembers(MemberTypes.Method, BindingFlags.Public ||| BindingFlags.Static ||| BindingFlags.Instance, MemberFilter delegateToSearchCriteria, "ReferenceEquals")

    for info in arrayMemberInfo do
        printfn $"Result of FindMembers -\t{info}\n"
with e ->
    printfn $"Exception : {e}"

(* The example produces the following output:

Result of FindMembers - Boolean ReferenceEquals(System.Object, System.Object)
*)

Imports System.Reflection

Class MyFindMembersClass

    Public Shared Sub Main()
        Dim objTest As New Object()
        Dim objType As Type = objTest.GetType()
        Dim arrayMemberInfo() As MemberInfo
        Try
            'Find all static or public methods in the Object 
            'class that match the specified name.
            arrayMemberInfo = objType.FindMembers(MemberTypes.Method, _
                              BindingFlags.Public Or BindingFlags.Static _
                              Or BindingFlags.Instance, _
                              New MemberFilter(AddressOf DelegateToSearchCriteria), _
                              "ReferenceEquals")

            Dim index As Integer
            For index = 0 To arrayMemberInfo.Length - 1
                Console.WriteLine("Result of FindMembers -" + ControlChars.Tab + _
                               arrayMemberInfo(index).ToString() + ControlChars.Cr)
            Next index
        Catch e As Exception
            Console.WriteLine("Exception : " + e.ToString())
        End Try
    End Sub

    Public Shared Function DelegateToSearchCriteria _
                            (ByVal objMemberInfo As MemberInfo, _
                             ByVal objSearch As Object) As Boolean
        ' Compare the name of the member function with the filter criteria.
        If objMemberInfo.Name.ToString() = objSearch.ToString() Then
            Return True
        Else
            Return False
        End If
    End Function 'DelegateToSearchCriteria 
End Class
' The example produces the following output:
'
' Result of FindMembers - Boolean ReferenceEquals(System.Object, System.Object)

Комментарии

Этот метод можно переопределить производным классом.

Члены включают свойства, методы, поля, события и т. д.

Для успешного получения сведений о члене FindMembers аргумент должен включать по крайней мере один из BindingFlags.Instance и BindingFlags.Static, а также хотя бы один из BindingFlags.NonPublic и BindingFlags.Public.bindingAttr

BindingFlags Следующие флаги фильтров можно использовать для определения элементов, которые необходимо включить в поиск:

  • Укажите BindingFlags.Instance , чтобы включить элементы экземпляра в поиск.

  • Укажите BindingFlags.Static , чтобы включить статические элементы в поиск.

  • Укажите BindingFlags.Public , чтобы включить общедоступные члены в поиск.

  • Укажите BindingFlags.NonPublic , чтобы включить не открытые члены (т. е. частные, внутренние и защищенные элементы) в поиск.

Для изменения работы поиска можно использовать следующие BindingFlags флаги модификатора:

  • BindingFlags.DeclaredOnly поиск только членов, объявленных на Typeнее, а не наследуемые.

См. System.Reflection.BindingFlags для получения дополнительной информации.

Чтобы получить инициализатор класса (статический конструктор) с помощью этого метода, необходимо указать BindingFlags.Static | BindingFlags.NonPublic (BindingFlags.StaticOrBindingFlags.NonPublic в Visual Basic). Вы также можете получить инициализатор класса с помощью TypeInitializer свойства.

Если текущий Type представляет параметр типа универсального типа или универсального метода, обрабатывает все члены, FindMembers объявленные ограничением класса и ограничениями интерфейса параметра типа.

Аргумент filter может быть пользовательским делегатом типа MemberFilterили одним из следующих предопределенных делегатов:

  • Type.FilterAttribute, который использует битовую маску или MethodImplAttributes битовуюFieldAttributesMethodAttributes маску filterCriteria в качестве значения.

  • Type.FilterName, который выполняет сравнение с учетом регистра каждого имени члена со строкой, переданной в filterCriteria.

  • Type.FilterNameIgnoreCase, который выполняет сравнение без учета регистра каждого имени члена со строкой, переданной в filterCriteria.

Применяется к

См. также раздел