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


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);
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);
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

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

-или-

Default для возврата null.

filter
MemberFilter

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

filterCriteria
Object

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

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

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

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

-или-

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

Реализации

Исключения

filter имеет значение null.

Примеры

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

using namespace System;
using namespace System::Reflection;
ref class MyFindMembersClass
{
public:
   static void Test()
   {
      Object^ objTest = gcnew Object;
      Type^ objType = objTest->GetType();
      array<MemberInfo^>^arrayMemberInfo;
      try
      {
         
         //Find all static or public methods in the Object class that match the specified name.
         arrayMemberInfo = objType->FindMembers( MemberTypes::Method, static_cast<BindingFlags>(BindingFlags::Public | BindingFlags::Static | BindingFlags::Instance), gcnew MemberFilter( DelegateToSearchCriteria ), "ReferenceEquals" );
         for ( int index = 0; index < arrayMemberInfo->Length; index++ )
            Console::WriteLine( "Result of FindMembers -\t {0}", String::Concat( arrayMemberInfo[ index ], "\n" ) );
      }
      catch ( Exception^ e ) 
      {
         Console::WriteLine( "Exception : {0}", e );
      }

   }

   static bool DelegateToSearchCriteria( MemberInfo^ objMemberInfo, Object^ objSearch )
   {
      
      // Compare the name of the member function with the filter criteria.
      if ( objMemberInfo->Name->Equals( objSearch->ToString() ) )
            return true;
      else
            return false;
   }

};

int main()
{
   MyFindMembersClass::Test();
}
/* The example produces the following output:

Result of FindMembers - Boolean ReferenceEquals(System.Object, System.Object)
*/
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 Чтобы метод успешно извлек сведения об элементеbindingAttr, аргумент должен содержать по крайней мере один из BindingFlags.Instance и BindingFlags.Static, а также по крайней мере один из BindingFlags.NonPublic и BindingFlags.Public.

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, в котором в качестве значения используется битоваяFieldAttributesMethodAttributes маска или MethodImplAttributes .filterCriteria

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

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

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

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