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