Metodi System.Type.GetProperty

Questo articolo fornisce osservazioni supplementari alla documentazione di riferimento per questa API.

Metodo GetProperty(String)

La ricerca name fa distinzione tra maiuscole e minuscole. La ricerca include proprietà dell'istanza pubblica e statica pubblica.

Una proprietà viene considerata pubblica per la reflection se dispone di almeno una funzione di accesso pubblica. In caso contrario, la proprietà è considerata privata ed è necessario usare BindingFlags.NonPublic | | BindingFlags.InstanceBindingFlags.Static (in Visual Basic, combinare i valori usando Or) per ottenerla.

Se l'oggetto corrente Type rappresenta un tipo generico costruito, questo metodo restituisce PropertyInfo con i parametri di tipo sostituiti dagli argomenti di tipo appropriati.

Se l'oggetto corrente Type rappresenta un parametro di tipo nella definizione di un tipo generico o di un metodo generico, questo metodo cerca le proprietà del vincolo di classe.

Le situazioni in cui AmbiguousMatchException si verificano includono quanto segue:

  • Un tipo contiene due proprietà indicizzate con lo stesso nome ma numeri diversi di parametri. Per risolvere l'ambiguità, usare un overload del GetProperty metodo che specifica i tipi di parametro.
  • Un tipo derivato dichiara una proprietà che nasconde una proprietà ereditata con lo stesso nome, usando il new modificatore (Shadows in Visual Basic). Per risolvere l'ambiguità, usare l'overload del GetProperty(String, BindingFlags) metodo e aggiungere il BindingFlags.DeclaredOnly flag per limitare la ricerca ai membri che non vengono ereditati.

Metodo GetProperty(String, BindingFlags)

Una proprietà viene considerata pubblica per la reflection se dispone di almeno una funzione di accesso pubblica. In caso contrario, la proprietà è considerata privata ed è necessario usare BindingFlags.NonPublic | | BindingFlags.InstanceBindingFlags.Static (in Visual Basic, combinare i valori usando Or) per ottenerla.

I flag di filtro seguenti BindingFlags possono essere usati per definire le proprietà da includere nella ricerca:

  • È necessario specificare BindingFlags.Instance o BindingFlags.Static per ottenere un ritorno.
  • Specificare BindingFlags.Public per includere le proprietà pubbliche nella ricerca.
  • Specificare BindingFlags.NonPublic di includere proprietà non pubbliche , ovvero proprietà private, interne e protette, nella ricerca.
  • Specificare BindingFlags.FlattenHierarchy di includere public e protected membri statici nella gerarchia. private I membri statici nelle classi ereditate non sono inclusi.

Per modificare il funzionamento della ricerca, è possibile usare i flag di modificatore seguenti BindingFlags :

  • BindingFlags.IgnoreCase per ignorare il caso di name.
  • BindingFlags.DeclaredOnly per cercare solo le proprietà dichiarate in Type, non le proprietà semplicemente ereditate.

Per altre informazioni, vedere System.Reflection.BindingFlags.

Se l'oggetto corrente Type rappresenta un tipo generico costruito, questo metodo restituisce PropertyInfo con i parametri di tipo sostituiti dagli argomenti di tipo appropriati.

Se l'oggetto corrente Type rappresenta un parametro di tipo nella definizione di un tipo generico o di un metodo generico, questo metodo cerca le proprietà del vincolo di classe.

Le situazioni in cui AmbiguousMatchException si verificano includono quanto segue:

  • Un tipo contiene due proprietà indicizzate con lo stesso nome ma numeri diversi di parametri. Per risolvere l'ambiguità, usare un overload del GetProperty metodo che specifica i tipi di parametro.
  • Un tipo derivato dichiara una proprietà che nasconde una proprietà ereditata con lo stesso nome, usando il new modificatore (Shadows in Visual Basic). Per risolvere l'ambiguità, includere BindingFlags.DeclaredOnly per limitare la ricerca ai membri che non vengono ereditati.

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

Una proprietà viene considerata pubblica per la reflection se dispone di almeno una funzione di accesso pubblica. In caso contrario, la proprietà è considerata privata ed è necessario usare BindingFlags.NonPublic | | BindingFlags.InstanceBindingFlags.Static (in Visual Basic, combinare i valori usando Or) per ottenerla.

Anche se il binder predefinito non elabora ParameterModifier (il parametro ), è possibile usare la classe astratta System.Reflection.Binder per scrivere un binder personalizzato che esegue l'elaborazione modifiersmodifiersdi . ParameterModifier viene utilizzato solo quando si esegue la chiamata tramite interoperabilità COM e vengono gestiti solo i parametri passati per riferimento.

Nella tabella seguente vengono illustrati i membri di una classe base restituiti dai Get metodi quando si riflette su un tipo.

Tipo di membro Statico Non statico
Costruttore No No
Campo No Sì. Un campo è sempre hide-by-name-and-signature.
Evento Non applicabile La regola di sistema dei tipi comune è che l'ereditarietà è uguale a quella dei metodi che implementano la proprietà . La reflection considera le proprietà come hide-by-name-and-signature.2
metodo No Sì. Un metodo (virtuale e non virtuale) può essere hide-by-name o hide-by-name-and-signature.
Tipo annidato No No
Proprietà Non applicabile La regola di sistema dei tipi comune è che l'ereditarietà è uguale a quella dei metodi che implementano la proprietà . La reflection considera le proprietà come hide-by-name-and-signature.2

Note:

  1. Hide-by-name-and-signature considera tutte le parti della firma, inclusi modificatori personalizzati, tipi restituiti, tipi di parametro, sentinel e convenzioni di chiamata non gestite. Si tratta di un confronto binario.
  2. Per la reflection, le proprietà e gli eventi sono hide-by-name-and-signature. Se si dispone di una proprietà con una funzione di accesso get e set nella classe base, ma la classe derivata ha solo una funzione di accesso get, la proprietà della classe derivata nasconde la proprietà della classe base e non sarà possibile accedere al setter nella classe base.
  3. Gli attributi personalizzati non fanno parte del sistema di tipi comune.

I flag di filtro seguenti BindingFlags possono essere usati per definire le proprietà da includere nella ricerca:

  • È necessario specificare BindingFlags.Instance o BindingFlags.Static per ottenere un ritorno.
  • Specificare BindingFlags.Public per includere le proprietà pubbliche nella ricerca.
  • Specificare BindingFlags.NonPublic di includere proprietà non pubbliche , ovvero proprietà private, interne e protette, nella ricerca.
  • Specificare BindingFlags.FlattenHierarchy di includere public e protected membri statici nella gerarchia. private I membri statici nelle classi ereditate non sono inclusi.

Per modificare il funzionamento della ricerca, è possibile usare i flag di modificatore seguenti BindingFlags :

  • BindingFlags.IgnoreCase per ignorare il caso di name.
  • BindingFlags.DeclaredOnly per cercare solo le proprietà dichiarate in Type, non le proprietà semplicemente ereditate.

Per altre informazioni, vedere System.Reflection.BindingFlags.

Se l'oggetto corrente Type rappresenta un tipo generico costruito, questo metodo restituisce PropertyInfo con i parametri di tipo sostituiti dagli argomenti di tipo appropriati.

Se l'oggetto corrente Type rappresenta un parametro di tipo nella definizione di un tipo generico o di un metodo generico, questo metodo cerca le proprietà del vincolo di classe.

Indicizzatori e proprietà predefinite

Visual Basic, C# e C++ hanno una sintassi semplificata per l'accesso alle proprietà indicizzate e consentono a una proprietà indicizzata di essere un valore predefinito per il relativo tipo. Ad esempio, se la variabile myList fa riferimento a un ArrayListoggetto , la sintassi myList[3] (myList(3) in Visual Basic) recupera l'elemento con l'indice 3. È possibile eseguire l'overload della proprietà .

In C# questa funzionalità è denominata indicizzatore e non può essere fatto riferimento per nome. Per impostazione predefinita, un indicizzatore C# viene visualizzato nei metadati come proprietà indicizzata denominata Item. Tuttavia, uno sviluppatore di librerie di classi può usare l'attributo IndexerNameAttribute per modificare il nome dell'indicizzatore nei metadati. Ad esempio, la String classe ha un indicizzatore denominato Chars[]. Anche le proprietà indicizzate create usando linguaggi diversi da C# possono avere nomi diversi da Item.

Per determinare se un tipo ha una proprietà predefinita, utilizzare il GetCustomAttributes(Type, Boolean) metodo per testare l'attributo DefaultMemberAttribute . Se il tipo ha DefaultMemberAttribute, la MemberName proprietà restituisce il nome della proprietà predefinita.