Dieser Artikel wurde maschinell übersetzt. Wenn Sie die englische Version des Artikels anzeigen möchten, aktivieren Sie das Kontrollkästchen Englisch. Sie können den englischen Text auch in einem Popupfenster anzeigen, indem Sie den Mauszeiger über den Text bewegen.
Übersetzung
Englisch

Zugreifen auf Standardelemente

Jeder Typ kann einen Standardmember enthalten. Dieser wird aufgerufen, wenn im Aufruf kein Membername angegeben wurde. Standardmember können durch Aufrufen von der Type.InvokeMember-Methode mit String.Empty ("") als Membername aufgerufen werden. InvokeMember ruft das System.Reflection.DefaultMemberAttribute-Attribut vom Typ ab und ruft es anschließend auf. Im folgenden Beispiel wird der Standardmember von Class1 aufgerufen und der zurückgegebene Wert o zugewiesen.


Class1 c = new Class1();
object o;
o = c.GetType().InvokeMember("", BindingFlags.InvokeMethod, null, c, new object[0]);
Console.WriteLine("Default member result: {0}", o);


Standardelemente werden durch das DefaultMemberAttribute-Attribut des deklarierenden Typs angegeben. Bei der Klasse im folgenden Beispiel wurde DefaultMemberAttribute manuell hinzugefügt. Fügen Sie DefaultMemberAttribute nicht manuell hinzu, wenn in der Klasse ein Indexer deklariert ist. In diesem Fall fügt der Compiler das Attribut automatisch hinzu.


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


Folgendes Beispiel verdeutlicht, wie der Standardmember durch Abruf seines benutzerdefinierten Attributs abgerufen wird.


Type classType = typeof(Class1);
Type attribType = typeof(DefaultMemberAttribute);
DefaultMemberAttribute defMem =
    (DefaultMemberAttribute)Attribute.GetCustomAttribute((MemberInfo)classType, attribType);
MemberInfo[] memInfo = classType.GetMember(defMem.MemberName);


Einfacher ist die Verwendung der Type.GetDefaultMembers-Methode, die dasselbe Ergebnis liefert. Jedoch löst GetDefaultMembers eine InvalidOperationException aus, wenn für den Typ mehrere Standardmember definiert sind. Im folgenden Beispiel wird die Syntax für GetDefaultMembers veranschaulicht.


Type t = typeof(Class1);
MemberInfo[] memInfo = t.GetDefaultMembers();


Sie können die benutzerdefinierten Attribute für einen Typ auch abrufen und nur DefaultMemberAttribute auswählen, indem Sie die GetCustomAttributes-Methode verwenden. Im folgenden Beispiel wird dieses Verfahren veranschaulicht.


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


Community-Beiträge

Anzeigen: