Type.GetDefaultMembers 方法

定义

搜索为设置了 Type 的当前 DefaultMemberAttribute 定义的成员。

public:
 virtual cli::array <System::Reflection::MemberInfo ^> ^ GetDefaultMembers();
public virtual System.Reflection.MemberInfo[] GetDefaultMembers ();
abstract member GetDefaultMembers : unit -> System.Reflection.MemberInfo[]
override this.GetDefaultMembers : unit -> System.Reflection.MemberInfo[]
Public Overridable Function GetDefaultMembers () As MemberInfo()

返回

MemberInfo[]

表示当前 MemberInfo 的所有默认成员的 Type 对象数组。

  • 或 - 如果当前 MemberInfo 没有默认成员,则为 Type 类型的空数组。

实现

示例

以下示例获取 的默认成员信息并显示 MyClass 默认成员。

using namespace System;
using namespace System::Reflection;
using namespace System::IO;

[DefaultMemberAttribute("Age")]
public ref class MyClass
{
public:
   void Name( String^ s ){}


   property int Age 
   {
      int get()
      {
         return 20;
      }

   }

};

int main()
{
   try
   {
      Type^ myType = MyClass::typeid;
      array<MemberInfo^>^memberInfoArray = myType->GetDefaultMembers();
      if ( memberInfoArray->Length > 0 )
      {
         System::Collections::IEnumerator^ myEnum = memberInfoArray->GetEnumerator();
         while ( myEnum->MoveNext() )
         {
            MemberInfo^ memberInfoObj = safe_cast<MemberInfo^>(myEnum->Current);
            Console::WriteLine( "The default member name is: {0}", memberInfoObj );
         }
      }
      else
      {
         Console::WriteLine( "No default members are available." );
      }
   }
   catch ( InvalidOperationException^ e ) 
   {
      Console::WriteLine( "InvalidOperationException: {0}", e->Message );
   }
   catch ( IOException^ e ) 
   {
      Console::WriteLine( "IOException: {0}", e->Message );
   }
   catch ( Exception^ e ) 
   {
      Console::WriteLine( "Exception: {0}", e->Message );
   }
}

using System;
using System.Reflection;
using System.IO;

[DefaultMemberAttribute("Age")]
public class MyClass
{
    public void Name(String s) {}
    public int Age
    {
        get
        {
            return 20;
        }
    }
    public static void Main()
    {
        try
        {
            Type  myType = typeof(MyClass);
            MemberInfo[] memberInfoArray = myType.GetDefaultMembers();
            if (memberInfoArray.Length > 0)
            {
                foreach(MemberInfo memberInfoObj in memberInfoArray)
                {
                    Console.WriteLine("The default member name is: " + memberInfoObj.ToString());
                }
            }
            else
            {
                Console.WriteLine("No default members are available.");
            }
        }
        catch(InvalidOperationException e)
        {
            Console.WriteLine("InvalidOperationException: " + e.Message);
        }
        catch(IOException e)
        {
            Console.WriteLine("IOException: " + e.Message);
        }
        catch(Exception e)
        {
            Console.WriteLine("Exception: " + e.Message);
        }
    }
}
Imports System.Reflection
Imports System.IO

<DefaultMemberAttribute("Age")> Public Class [MyClass]

    Public Sub Name(ByVal s As String)
    End Sub

    Public ReadOnly Property Age() As Integer
        Get
            Return 20
        End Get
    End Property

    Public Shared Sub Main()
        Try
            Dim myType As Type = GetType([MyClass])
            Dim memberInfoArray As MemberInfo() = myType.GetDefaultMembers()
            If memberInfoArray.Length > 0 Then
                Dim memberInfoObj As MemberInfo
                For Each memberInfoObj In memberInfoArray
                    Console.WriteLine("The default member name is: " + memberInfoObj.ToString())
                Next memberInfoObj
            Else
                Console.WriteLine("No default members are available.")
            End If
        Catch e As InvalidOperationException
            Console.WriteLine("InvalidOperationException: " + e.Message)
        Catch e As IOException
            Console.WriteLine("IOException: " + e.Message)
        Catch e As Exception
            Console.WriteLine("Exception: " + e.Message)
        End Try
    End Sub
End Class

注解

GetDefaultMembers方法不按特定顺序(如字母顺序或声明顺序)返回成员。 代码不得依赖于返回成员的顺序,因为该顺序会有所不同。

此方法可通过派生类重写。

成员包括属性、方法、字段、事件等。

下表显示了在类型上反射时,方法返回的基 Get 类的成员。

成员类型 静态 非静态
构造函数
字段 可以。 字段始终按名称和签名进行隐藏。
事件 不适用 常见类型系统规则是继承与实现 属性的方法的继承相同。 反射将属性视为按名称和签名进行隐藏。 请参阅下面的注释 2。
方法 可以。 一 (虚拟和非虚拟) 可以按名称隐藏,也可以按名称和签名进行隐藏。
嵌套类型
properties 不适用 常见类型系统规则是继承与实现 属性的方法的继承相同。 反射将属性视为按名称和签名进行隐藏。 请参阅下面的注释 2。
  1. "按名称隐藏"和"签名"考虑签名的所有部分,包括自定义修饰符、返回类型、参数类型、sentinels 以及非托管调用约定。 这是二进制比较。

  2. 对于反射,属性和事件按名称和签名进行隐藏。 如果属性在基类中同时具有 get 和 set 访问器,但派生类只有 get 访问器,则派生类属性将隐藏基类属性,并且你将无法访问基类上的 setter。

  3. 自定义属性不是通用类型系统的一部分。

如果当前 Type 表示构造的泛型类型,则此方法返回对象 MemberInfo ,类型参数替换为相应的类型参数。 例如,如果类具有返回 的属性,则调用 在 C# 中返回 , (C<T> P T 返回 GetDefaultMembers C<int> int P Property P As Integer Visual Basic) 。

如果当前 表示泛型类型或泛型方法的定义中的类型参数,则此方法将搜索类约束的成员;如果没有类约束,则此方法将搜索 Type Object 的成员。

适用于

另请参阅