Type.GetDefaultMembers 方法

定义

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

public:
 virtual cli::array <System::Reflection::MemberInfo ^> ^ GetDefaultMembers();
[System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(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[] GetDefaultMembers();
public virtual System.Reflection.MemberInfo[] GetDefaultMembers();
[<System.Diagnostics.CodeAnalysis.DynamicallyAccessedMembers(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 GetDefaultMembers : unit -> System.Reflection.MemberInfo[]
override this.GetDefaultMembers : unit -> System.Reflection.MemberInfo[]
abstract member GetDefaultMembers : unit -> System.Reflection.MemberInfo[]
override this.GetDefaultMembers : unit -> System.Reflection.MemberInfo[]
Public Overridable Function GetDefaultMembers () As MemberInfo()

返回

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

-或-

如果当前MemberInfo没有默认成员,则为一Type个空数组。

实现

属性

示例

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

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);
        }
    }
}
open System
open System.Reflection
open System.IO

[<DefaultMemberAttribute "Age">]
type MyClass() =
    member _.Name(s: string) = ()
    member _.Age 
        with get () =
            20
try
    let myType = typeof<MyClass>
    let memberInfoArray = myType.GetDefaultMembers()
    if memberInfoArray.Length > 0 then
        for memberInfoObj in memberInfoArray do
            printfn $"The default member name is: {memberInfoObj}"
    else
        printfn "No default members are available."
with
| :? InvalidOperationException as e ->
    printfn $"InvalidOperationException: {e.Message}"
| :? IOException as e ->
    printfn $"IOException: {e.Message}"
| e ->
    printfn $"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 方法在反射类型时返回的基类成员。

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

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

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

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

如果当前 Type 表示泛型类型或泛型方法定义中的类型参数,则此方法将搜索类约束的成员,或者不存在类约束的成员 Object

适用于

另请参阅