Partager via


Accès aux membres par défaut

Tous les types peuvent posséder un membre par défaut, lequel est un membre appelé lorsque aucun nom de membre n'est donné. Pour appeler des membres par défaut, utilisez la méthode Type.InvokeMember avec String.Empty ("") comme nom de membre. InvokeMember extrait l'attribut System.Reflection.DefaultMemberAttribute du type, puis l'appelle. L'exemple suivant appelle le membre par défaut de Class1 et la valeur retournée est assignée à 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);

Les membres par défaut sont indiqués par l'attribut DefaultMemberAttribute sur le type déclarant. DefaultMemberAttribute a été ajouté manuellement à la classe illustrée dans l'exemple suivant. N'ajoutez pas DefaultMemberAttribute manuellement si la classe possède un indexeur déclaré ; dans ce cas, le compilateur ajoute automatiquement l'attribut.

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

L'exemple suivant montre comment récupérer le membre par défaut à partir de son attribut personnalisé.

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

Il peut être plus simple d'utiliser la méthode Type.GetDefaultMembers, qui produit le même résultat. Cependant, GetDefaultMembers lève InvalidOperationException si plusieurs membres par défaut sont définis sur le type. L'exemple suivant illustre la syntaxe de 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();

Vous pouvez également obtenir les attributs personnalisés pour un type et sélectionner simplement DefaultMemberAttribute, à l'aide de la méthode GetCustomAttributes. L'exemple suivant illustre cette technique.

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

Voir aussi

Référence

DefaultMemberAttribute

Type.GetDefaultMembers

Concepts

Affichage des informations de type