System.Type.GetProperty-metoder

Anmärkning

Den här artikeln innehåller ytterligare kommentarer till referensdokumentationen för det här API:et.

Följande vägledning gäller för alla överbelastningar:

  • En egenskap anses offentlig vid reflektion om den har minst en accessor som är offentlig. Annars anses egenskapen vara privat och du måste använda BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static (i Visual Basic kombinerar du värdena med ) Orför att hämta den.
  • Om den aktuella Type representerar en konstruerad generisk typ returnerar den här metoden PropertyInfo med typparametrarna ersatta av lämpliga typargument.
  • Om den aktuella Type representerar en typparameter i definitionen av en allmän typ eller allmän metod söker den här metoden igenom egenskaperna för klassbegränsningen.

GetProperty(String) metod

Sökningen efter name är skiftlägeskänslig. Sökningen inkluderar publika statiska och publika instans-egenskaper.

Situationer där AmbiguousMatchException inträffar är följande:

  • En typ innehåller två indexerade egenskaper som har samma namn men olika antal parametrar. Lös tvetydigheten genom att använda en överlagring av metoden GetProperty som anger parametertyper.
  • En härledd typ deklarerar en egenskap som döljer en ärvd egenskap med samma namn med hjälp new av modifieraren (Shadows i Visual Basic). Lös tvetydigheten genom att använda GetProperty(String, BindingFlags) metodens överlagring och lägga till BindingFlags.DeclaredOnly flaggan för att begränsa sökningen till medlemmar som inte ärvs.

GetProperty(String, BindingFlags) metod

Följande BindingFlags filterflaggor kan användas för att definiera vilka egenskaper som ska inkluderas i sökningen:

  • Du måste ange antingen BindingFlags.Instance eller BindingFlags.Static för att få en retur.
  • Ange BindingFlags.Public att offentliga egenskaper ska inkluderas i sökningen.
  • Ange BindingFlags.NonPublic att icke-offentliga egenskaper (dvs. privata, interna och skyddade egenskaper) ska inkluderas i sökningen.
  • Ange BindingFlags.FlattenHierarchy att inkludera public och protected statiska medlemmar i hierarkin. private Statiska medlemmar i ärvda klasser ingår inte.

Följande BindingFlags modifierarflaggor kan användas för att ändra hur sökningen fungerar:

  • BindingFlags.IgnoreCase för att ignorera fallet namemed .
  • BindingFlags.DeclaredOnly om du bara vill söka efter de egenskaper som deklarerats i Type, inte egenskaper som helt enkelt ärvts.

Situationer där AmbiguousMatchException inträffar är följande:

  • En typ innehåller två indexerade egenskaper som har samma namn men olika antal parametrar. Lös tvetydigheten genom att använda en överlagring av metoden GetProperty som anger parametertyper.
  • En härledd typ deklarerar en egenskap som döljer en ärvd egenskap med samma namn med hjälp av new modifieraren (Shadows i Visual Basic). Lös tvetydigheten genom att inkludera BindingFlags.DeclaredOnly för att begränsa sökningen till medlemmar som inte är ärvda.

GetProperty(System.String, System.Reflection.BindingFlags, System.Reflection.Binder, System.Type, System.Type[], System.Reflection.ParameterModifier[])

Även om standardbindaren inte bearbetar ParameterModifier (parametern modifiers) kan du använda den abstrakta klassen System.Reflection.Binder för att skriva en anpassad bindare som bearbetar modifiers. ParameterModifier används endast vid anrop via COM-interop, och endast parametrar som skickas av referens hanteras.

I följande tabell visas vilka medlemmar i en basklass som returneras av metoderna när de Get reflekterar över en typ.

Medlemstyp Statisk Icke-statisk
Konstruktor Nej Nej
Fält Nej Ja. Ett fält är alltid dolt genom namn och signatur (hide-by-name-and-signature).
Evenemang Ej tillämpligt Den vanliga typen av systemregel är att arvet är detsamma som för de metoder som implementerar egenskapen. Reflektion behandlar egenskaper som hide-by-name-and-signature. 2
Metod Nej Ja. En metod (både virtuell och icke-virtuell) kan vara hide-by-name eller hide-by-name-and-signature.
Kapslad typ Nej Nej
Fastighet Ej tillämpligt Den vanliga typen av systemregel är att arvet är detsamma som för de metoder som implementerar egenskapen. Reflektion behandlar egenskaper som hide-by-name-and-signature. 2

Anteckningar:

  • Dölj efter namn och signatur tar hänsyn till alla delar av signaturen, inklusive anpassade modifierare, returtyper, parametertyper, sentinels och ohanterade anropskonventioner. Det här är en binär jämförelse.
  • För reflektion är egenskaper och händelser dolda genom namn och signatur. Om du har en egenskap med både en get- och en set-accessor i basklassen, men den härledda klassen bara har en get-accessor, döljer egenskapen i den härledda klassen basklassegenskapen och du kommer inte att kunna komma åt set-accessorn i basklassen.
  • Anpassade attribut ingår inte i det vanliga typsystemet.

Följande BindingFlags filterflaggor kan användas för att definiera vilka egenskaper som ska inkluderas i sökningen:

  • Du måste ange antingen BindingFlags.Instance eller BindingFlags.Static för att få en retur.
  • Ange BindingFlags.Public att offentliga egenskaper ska inkluderas i sökningen.
  • Ange BindingFlags.NonPublic att icke-offentliga egenskaper (dvs. privata, interna och skyddade egenskaper) ska inkluderas i sökningen.
  • Ange BindingFlags.FlattenHierarchy att inkludera public och protected statiska medlemmar i hierarkin. private Statiska medlemmar i ärvda klasser ingår inte.

Följande BindingFlags modifierarflaggor kan användas för att ändra hur sökningen fungerar:

  • BindingFlags.IgnoreCase för att ignorera fallet namemed .
  • BindingFlags.DeclaredOnly om du bara vill söka efter de egenskaper som deklarerats i Type, inte egenskaper som helt enkelt ärvts.

Indexerare och standardegenskaper

Visual Basic, C#och C++ har förenklad syntax för åtkomst till indexerade egenskaper och tillåter att en indexerad egenskap är standard för dess typ. Om variabeln myList till exempel refererar till en ArrayListhämtar syntaxen myList[3] (myList(3) i Visual Basic) elementet med indexet 3. Du kan överbelasta egenskapen.

I C# kallas den här funktionen för indexerare och kan inte refereras till med namn. Som standard visas en C#-indexerare i metadata som en indexerad egenskap med namnet Item. En klassbiblioteksutvecklare kan dock använda IndexerNameAttribute attributet för att ändra namnet på indexeraren i metadata. Klassen String har till exempel en indexerare med namnet Chars[]. Indexerade egenskaper som skapats med andra språk än C# kan också ha andra namn än Item.

Om du vill avgöra om en typ har en standardegenskap använder du GetCustomAttributes(Type, Boolean) metoden för att testa attributet DefaultMemberAttribute . Om typen har DefaultMemberAttributeMemberName returnerar egenskapen namnet på standardegenskapen.