Share via


存取預設成員

任何型別都可以具有預設成員,是未指定成員名稱時所叫用的成員。 您可以使用 String.Empty ("") 做為成員名稱來呼叫 Type.InvokeMember 方法,如此就能叫用預設成員。 InvokeMember 會從型別擷取 System.Reflection.DefaultMemberAttribute 屬性,然後叫用它。 下列程式碼範例叫用 Class1 的預設成員,而它傳回的值則是指派為 o。

Dim c As New Class1()
Dim o As Object
o = c.GetType().InvokeMember("", BindingFlags.InvokeMethod, Nothing, c, New Object(){})
Console.WriteLine("Default member result: {0}", o)
Class1 c = new Class1();
object o;
o = c.GetType().InvokeMember("", BindingFlags.InvokeMethod, null, c, new object[0]);
Console.WriteLine("Default member result: {0}", o);
Class1^ c = gcnew Class1();
Object^ o;
o = c->GetType()->InvokeMember("", BindingFlags::InvokeMethod, nullptr, c, gcnew array<Object^>(0));
Console::WriteLine("Default member result: {0}", o);

預設成員會由宣告型別上的 DefaultMemberAttribute 屬性指出。 下列範例顯示的類別中已手動加入 DefaultMemberAttribute。 如果類別已宣告索引子,則不要手動加入 DefaultMemberAttribute;在該情況下,編譯器會自動加入屬性。

<DefaultMember("GetIVal")> _
Public Class Class1
    Private ival As Integer
    Private sval As String

    Public Sub New()
        ival = 5050
        sval = "6040"
    End Sub

    Public Function GetIVal() As Integer
        Return ival
    End Function

    Public Function GetSVal() As String
        Return sval
    End Function
End Class
[DefaultMember("GetIVal")]
public class Class1
{
    private int ival;
    private string sval;

    public Class1()
    {
        ival = 5050;
        sval = "6040";
    }

    public int GetIVal()
    {
        return ival;
    }

    public string GetSVal()
    {
        return sval;
    }
}
[DefaultMember("GetIVal")]
public ref class Class1
{
private:
    int ival;
    String^ sval;

public:
    Class1()
    {
        ival = 5050;
        sval = "6040";
    }

    int GetIVal()
    {
        return ival;
    }

    String^ GetSVal()
    {
        return sval;
    }
};

下列程式碼範例說明如何擷取預設成員的自訂屬性,以擷取預設成員。

Dim classType As Type = GetType(Class1)
Dim attribType As Type = GetType(DefaultMemberAttribute)
Dim defMem As DefaultMemberAttribute = _
    CType(Attribute.GetCustomAttribute(CType(classType, MemberInfo), attribType), _
    DefaultMemberAttribute)
Dim memInfo() As MemberInfo = classType.GetMember(defMem.MemberName)
Type classType = typeof(Class1);
Type attribType = typeof(DefaultMemberAttribute);
DefaultMemberAttribute defMem =
    (DefaultMemberAttribute)Attribute.GetCustomAttribute((MemberInfo)classType, attribType);
MemberInfo[] memInfo = classType.GetMember(defMem.MemberName);
Type^ classType = Class1::typeid;
Type^ attribType = DefaultMemberAttribute::typeid;
DefaultMemberAttribute^ defMem =
    (DefaultMemberAttribute^)Attribute::GetCustomAttribute((MemberInfo^)classType, attribType);
array<MemberInfo^>^ memInfo = classType->GetMember(defMem->MemberName);

使用 Type.GetDefaultMembers 方法可能會比較簡單,它會產生相同的結果。 然而,如果型別上定義了多個預設成員,則 GetDefaultMembers 會擲回 InvalidOperationException。 下列範例會示範 GetDefaultMembers 的語法。

Dim t As Type = GetType(Class1)
Dim memInfo() As MemberInfo = t.GetDefaultMembers()
Type t = typeof(Class1);
MemberInfo[] memInfo = t.GetDefaultMembers();
Type^ t = Class1::typeid;
array<MemberInfo^>^ memInfo = t->GetDefaultMembers();

您也可以使用 GetCustomAttributes 方法取得型別的自訂屬性,並且只選取 DefaultMemberAttribute。 下列範例會示範這項技術。

Dim t As Type = GetType(Class1)
Dim customAttribs() As Object _
    = t.GetCustomAttributes(GetType(DefaultMemberAttribute), False)
If customAttribs.Length > 0 Then
    Dim defMem As DefaultMemberAttribute = CType(customAttribs(0), DefaultMemberAttribute)
    Dim memInfo() As MemberInfo = t.GetMember(defMem.MemberName)
    If memInfo.Length > 0 Then
        Console.WriteLine("Default Member: {0}", memInfo(0).Name)
    End If
End If
Type t = typeof(Class1);
object[] customAttribs = t.GetCustomAttributes(typeof(DefaultMemberAttribute), false);
if (customAttribs.Length > 0)
{
    DefaultMemberAttribute defMem = (DefaultMemberAttribute)customAttribs[0];
    MemberInfo[] memInfo = t.GetMember(defMem.MemberName);
    if (memInfo.Length > 0)
    {
        Console.WriteLine("Default Member: {0}", memInfo[0].Name);
    }
}
Type^ t = Class1::typeid;
array<Object^>^ customAttribs = t->GetCustomAttributes(DefaultMemberAttribute::typeid, false);
if (customAttribs->Length > 0)
{
    DefaultMemberAttribute^ defMem = (DefaultMemberAttribute^)customAttribs[0];
    array<MemberInfo^>^ memInfo = t->GetMember(defMem->MemberName);
    if (memInfo->Length > 0)
    {
        Console::WriteLine("Default Member: {0}", memInfo[0]->Name);
    }
}

請參閱

參考

DefaultMemberAttribute

Type.GetDefaultMembers

概念

檢視型別資訊