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
oBindingFlags.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 includerepublic
eprotected
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 diname
.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 modifiers
modifiers
di . 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:
- 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.
- 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.
- 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
oBindingFlags.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 includerepublic
eprotected
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 diname
.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.