Type.GetProperties Método
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Obtém as propriedades da corrente Type.
Sobrecargas
| Name | Description |
|---|---|
| GetProperties() |
Devolve todas as propriedades públicas do atual Type. |
| GetProperties(BindingFlags) |
Quando sobrescrito numa classe derivada, procura as propriedades da corrente Type, usando as restrições de ligação especificadas. |
GetProperties()
Devolve todas as propriedades públicas do atual Type.
public:
virtual cli::array <System::Reflection::PropertyInfo ^> ^ GetProperties();
public:
cli::array <System::Reflection::PropertyInfo ^> ^ GetProperties();
public System.Reflection.PropertyInfo[] GetProperties();
abstract member GetProperties : unit -> System.Reflection.PropertyInfo[]
override this.GetProperties : unit -> System.Reflection.PropertyInfo[]
member this.GetProperties : unit -> System.Reflection.PropertyInfo[]
Public Function GetProperties () As PropertyInfo()
Devoluções
Um array de PropertyInfo objetos que representa todas as propriedades públicas do atual Type.
-ou-
Um array vazio do tipo PropertyInfo, se a corrente Type não tiver propriedades públicas.
Implementações
Exemplos
O exemplo a seguir demonstra o uso do GetProperties método.
PropertyInfo[] myPropertyInfo;
// Get the properties of 'Type' class object.
myPropertyInfo = Type.GetType("System.Type").GetProperties();
Console.WriteLine("Properties of System.Type are:");
for (int i = 0; i < myPropertyInfo.Length; i++)
{
Console.WriteLine(myPropertyInfo[i].ToString());
}
// Get the properties of 'Type' class object.
let myPropertyInfo = Type.GetType("System.Type").GetProperties()
printfn "Properties of System.Type are:"
for pi in myPropertyInfo do
printfn $"{pi}"
Dim myPropertyInfo() As PropertyInfo
' Get the properties of 'Type' class object.
myPropertyInfo = Type.GetType("System.Type").GetProperties()
Console.WriteLine("Properties of System.Type are:")
Dim i As Integer
For i = 0 To myPropertyInfo.Length - 1
Console.WriteLine(myPropertyInfo(i).ToString())
Next i
Observações
Chamar esta sobrecarga equivale a chamar a sobrecarga GetProperties(BindingFlags) com um argumento bindingAttr igual a BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public em C# e BindingFlags.Instance Or BindingFlags.Static Or BindingFlags.Public em Visual Basic. Devolve todas as propriedades de instância pública e estáticas, tanto aquelas definidas pelo tipo representado pelo objeto atual Type como aquelas herdadas dos seus tipos base.
Um imóvel é considerado público para reflexão se tiver pelo menos um acessor que seja público. Caso contrário, a propriedade é considerada privada, e você deve usar BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static (no Visual Basic, combinar os valores usando Or) para obtê-la.
No .NET 6 e versões anteriores, o método GetProperties não devolve propriedades numa ordem específica, como ordem alfabética ou de declaração. O seu código não deve depender da ordem em que as propriedades são devolvidas, porque essa ordem varia. No entanto, a partir do .NET 7, a ordenação é determinística com base na ordenação dos metadados na assembleia.
A tabela a seguir mostra quais membros de uma classe base são retornados pelos Get métodos ao refletir sobre um tipo.
| Tipo de Membro | Estático | Não-estático |
|---|---|---|
| Construtor | No | No |
| Campo | No | Yes. Um campo é sempre ocultado com base no nome e assinatura. |
| Event | Não aplicável | A regra comum do sistema de tipos é que a herança é a mesma dos métodos que implementam a propriedade. A reflexão trata propriedades como esconder pelo nome e assinatura. Veja a nota 2 abaixo. |
| Método | No | Yes. Um método (virtual e não virtual) pode ser ocultado por nome ou ocultado por nome e assinatura. |
| Tipo aninhado | No | No |
| Property | Não aplicável | A regra comum do sistema de tipos é que a herança é a mesma dos métodos que implementam a propriedade. A reflexão trata propriedades como esconder pelo nome e assinatura. Veja a nota 2 abaixo. |
Ocultar por nome e assinatura considera todas as partes da assinatura, incluindo modificadores personalizados, tipos de retorno, tipos de parâmetros, sentinelas e convenções de chamada não gerenciadas. Esta é uma comparação binária.
Para reflexão, as propriedades e os eventos são ocultados por nome e assinatura. Se você tiver uma propriedade com um acessador get e um set na classe base, mas a classe derivada tiver apenas um acessor get, a propriedade de classe derivada ocultará a propriedade de classe base e você não poderá acessar o setter na classe base.
Os atributos personalizados não fazem parte do sistema de tipo comum.
Se a corrente Type representa um tipo genérico construído, este método devolve os PropertyInfo objetos com os parâmetros de tipo substituídos pelos argumentos de tipo apropriados.
Se o current Type representa um parâmetro type na definição de um tipo genérico ou método genérico, esse método pesquisa as propriedades da restrição de classe.
Ver também
Aplica-se a
GetProperties(BindingFlags)
Quando sobrescrito numa classe derivada, procura as propriedades da corrente Type, usando as restrições de ligação especificadas.
public:
abstract cli::array <System::Reflection::PropertyInfo ^> ^ GetProperties(System::Reflection::BindingFlags bindingAttr);
public abstract System.Reflection.PropertyInfo[] GetProperties(System.Reflection.BindingFlags bindingAttr);
abstract member GetProperties : System.Reflection.BindingFlags -> System.Reflection.PropertyInfo[]
Public MustOverride Function GetProperties (bindingAttr As BindingFlags) As PropertyInfo()
Parâmetros
- bindingAttr
- BindingFlags
Uma combinação bit a bit dos valores de enumeração que especifica como a pesquisa é realizada.
-ou-
Default para devolver um array vazio.
Devoluções
Um array de objetos que representa todas as propriedades da corrente Type que correspondem às restrições de ligação especificadas.
-ou-
Um array vazio do tipo PropertyInfo, se a corrente Type não tiver propriedades, ou se nenhuma das propriedades corresponder às restrições de ligação.
Implementações
Exemplos
O exemplo seguinte define uma classe chamada PropertyClass que inclui seis propriedades: duas são públicas, uma é privada, uma é protegida, uma é interna (Friend em Visual Basic) e uma é interna protegida (Protected Friend em Visual Basic). Depois, apresenta alguma informação básica de propriedades (o nome e tipo da propriedade, se é leitura/escrita, e a visibilidade dos seus get e set acessórios) para as propriedades que correspondem às restrições de ligação especificadas.
using System;
using System.Reflection;
// Create a class having six properties.
public class PropertyClass
{
public String Property1
{
get { return "hello"; }
}
public String Property2
{
get { return "hello"; }
}
protected String Property3
{
get { return "hello"; }
}
private Int32 Property4
{
get { return 32; }
}
internal String Property5
{
get { return "value"; }
}
protected internal String Property6
{
get { return "value"; }
}
}
public class Example
{
public static void Main()
{
Type t = typeof(PropertyClass);
// Get the public properties.
PropertyInfo[] propInfos = t.GetProperties(BindingFlags.Public|BindingFlags.Instance);
Console.WriteLine("The number of public properties: {0}.\n",
propInfos.Length);
// Display the public properties.
DisplayPropertyInfo(propInfos);
// Get the nonpublic properties.
PropertyInfo[] propInfos1 = t.GetProperties(BindingFlags.NonPublic|BindingFlags.Instance);
Console.WriteLine("The number of non-public properties: {0}.\n",
propInfos1.Length);
// Display all the nonpublic properties.
DisplayPropertyInfo(propInfos1);
}
public static void DisplayPropertyInfo(PropertyInfo[] propInfos)
{
// Display information for all properties.
foreach (var propInfo in propInfos) {
bool readable = propInfo.CanRead;
bool writable = propInfo.CanWrite;
Console.WriteLine(" Property name: {0}", propInfo.Name);
Console.WriteLine(" Property type: {0}", propInfo.PropertyType);
Console.WriteLine(" Read-Write: {0}", readable & writable);
if (readable) {
MethodInfo getAccessor = propInfo.GetMethod;
Console.WriteLine(" Visibility: {0}",
GetVisibility(getAccessor));
}
if (writable) {
MethodInfo setAccessor = propInfo.SetMethod;
Console.WriteLine(" Visibility: {0}",
GetVisibility(setAccessor));
}
Console.WriteLine();
}
}
public static String GetVisibility(MethodInfo accessor)
{
if (accessor.IsPublic)
return "Public";
else if (accessor.IsPrivate)
return "Private";
else if (accessor.IsFamily)
return "Protected";
else if (accessor.IsAssembly)
return "Internal/Friend";
else
return "Protected Internal/Friend";
}
}
// The example displays the following output:
// The number of public properties: 2.
//
// Property name: Property1
// Property type: System.String
// Read-Write: False
// Visibility: Public
//
// Property name: Property2
// Property type: System.String
// Read-Write: False
// Visibility: Public
//
// The number of non-public properties: 4.
//
// Property name: Property3
// Property type: System.String
// Read-Write: False
// Visibility: Protected
//
// Property name: Property4
// Property type: System.Int32
// Read-Write: False
// Visibility: Private
//
// Property name: Property5
// Property type: System.String
// Read-Write: False
// Visibility: Internal/Friend
//
// Property name: Property6
// Property type: System.String
// Read-Write: False
// Visibility: Protected Internal/Friend
open System.Reflection
// Create a class having four properties.
type PropertyClass() =
member _.Property1 =
"hello"
member _.Property2 =
"hello"
member private _.Property3 =
32
member internal _.Property4 =
"value"
let getVisibility (accessor: MethodInfo) =
if accessor.IsPublic then
"Public"
elif accessor.IsPrivate then
"Private"
elif accessor.IsFamily then
"Protected"
elif accessor.IsAssembly then
"Internal/Friend"
else
"Protected Internal/Friend"
let displayPropertyInfo (propInfos: #seq<PropertyInfo>) =
// Display information for all properties.
for propInfo in propInfos do
let readable = propInfo.CanRead
let writable = propInfo.CanWrite
printfn $" Property name: {propInfo.Name}"
printfn $" Property type: {propInfo.PropertyType}"
printfn $" Read-Write: {readable && writable}"
if readable then
let getAccessor = propInfo.GetMethod
printfn $" Visibility: {getVisibility getAccessor}"
if writable then
let setAccessor = propInfo.SetMethod
printfn $" Visibility: {getVisibility setAccessor}"
printfn ""
let t = typeof<PropertyClass>
// Get the public properties.
let propInfos = t.GetProperties(BindingFlags.Public ||| BindingFlags.Instance)
printfn $"The number of public properties: {propInfos.Length}.\n"
// Display the public properties.
displayPropertyInfo propInfos
// Get the nonpublic properties.
let propInfos1 = t.GetProperties(BindingFlags.NonPublic ||| BindingFlags.Instance)
printfn $"The number of non-public properties: {propInfos1.Length}.\n"
// Display all the nonpublic properties.
displayPropertyInfo propInfos1
// The example displays the following output:
// The number of public properties: 2.
//
// Property name: Property1
// Property type: System.String
// Read-Write: False
// Visibility: Public
//
// Property name: Property2
// Property type: System.String
// Read-Write: False
// Visibility: Public
//
// The number of non-public properties: 2.
//
// Property name: Property3
// Property type: System.Int32
// Read-Write: False
// Visibility: Private
//
// Property name: Property4
// Property type: System.String
// Read-Write: False
// Visibility: Internal/Friend
Imports System.Reflection
' Create a class having six properties.
Public Class PropertyClass
Public ReadOnly Property Property1() As String
Get
Return "hello"
End Get
End Property
Public ReadOnly Property Property2() As String
Get
Return "hello"
End Get
End Property
Protected ReadOnly Property Property3() As String
Get
Return "hello"
End Get
End Property
Private ReadOnly Property Property4 As Integer
Get
Return 32
End Get
End Property
Friend ReadOnly Property Property5 As String
Get
Return "value"
End Get
End Property
Protected Friend ReadOnly Property Property6 As String
Get
Return "value"
End Get
End Property
End Class
Public Module Example
Public Sub Main()
Dim t As Type = GetType(PropertyClass)
' Get the public properties.
Dim propInfos As PropertyInfo() = t.GetProperties(BindingFlags.Public Or BindingFlags.Instance)
Console.WriteLine("The number of public properties: {0}",
propInfos.Length)
Console.WriteLine()
' Display the public properties.
DisplayPropertyInfo(propInfos)
' Get the non-public properties.
Dim propInfos1 As PropertyInfo() = t.GetProperties(BindingFlags.NonPublic Or BindingFlags.Instance)
Console.WriteLine("The number of non-public properties: {0}",
propInfos1.Length)
Console.WriteLine()
' Display all the non-public properties.
DisplayPropertyInfo(propInfos1)
End Sub
Public Sub DisplayPropertyInfo(ByVal propInfos() As PropertyInfo)
' Display information for all properties.
For Each propInfo In propInfos
Dim readable As Boolean = propInfo.CanRead
Dim writable As Boolean = propInfo.CanWrite
Console.WriteLine(" Property name: {0}", propInfo.Name)
Console.WriteLine(" Property type: {0}", propInfo.PropertyType)
Console.WriteLine(" Read-Write: {0}", readable And writable)
If readable Then
Dim getAccessor As MethodInfo = propInfo.GetMethod
Console.WriteLine(" Visibility: {0}",
GetVisibility(getAccessor))
End If
If writable Then
Dim setAccessor As MethodInfo = propInfo.SetMethod
Console.WriteLine(" Visibility: {0}",
GetVisibility(setAccessor))
End If
Console.WriteLine()
Next
End Sub
Public Function GetVisibility(accessor As MethodInfo) As String
If accessor.IsPublic Then
Return "Public"
ElseIf accessor.IsPrivate Then
Return "Private"
Else If accessor.IsFamily Then
Return "Protected"
Else If accessor.IsAssembly Then
Return "Internal/Friend"
Else
Return "Protected Internal/Friend"
End If
End Function
End Module
' The example displays the following output:
' The number of public properties: 2
'
' Property name: Property1
' Property type: System.String
' Read-Write: False
' Visibility: Public
'
' Property name: Property2
' Property type: System.String
' Read-Write: False
' Visibility: Public
'
' The number of non-public properties: 4
'
' Property name: Property3
' Property type: System.String
' Read-Write: False
' Visibility: Protected
'
' Property name: Property4
' Property type: System.Int32
' Read-Write: False
' Visibility: Private
'
' Property name: Property5
' Property type: System.String
' Read-Write: False
' Visibility: Internal/Friend
'
' Property name: Property6
' Property type: System.String
' Read-Write: False
' Visibility: Protected Internal/Friend
Observações
Para que a GetProperties(BindingFlags) sobrecarga recupere com sucesso informação de propriedades, o bindingAttr argumento deve incluir pelo menos um de BindingFlags.Instance e BindingFlags.Static, juntamente com pelo menos um de BindingFlags.NonPublic e BindingFlags.Public.
Os seguintes BindingFlags sinalizadores de filtro podem ser usados para definir quais propriedades devem ser incluídas na pesquisa:
Especifique
BindingFlags.Instanceincluir métodos de instância.Especifique
BindingFlags.Statica inclusão de métodos estáticos.Especifique
BindingFlags.Publicpara incluir propriedades públicas na pesquisa. Um imóvel é considerado público para reflexão se tiver pelo menos um acessor que seja público.Especifique
BindingFlags.NonPublicpara incluir propriedades não públicas (ou seja, propriedades privadas, internas e protegidas) na pesquisa. Apenas as propriedades protegidas e internas nas classes base são devolvidas; Propriedades privadas nas classes base não são devolvidas.Especifique
BindingFlags.FlattenHierarchypara incluirpubliceprotectedmembros estáticos na hierarquia;privatemembros estáticos em classes herdadas não são incluídos.Especifique
BindingFlags.Defaultsozinho para devolver um array vazio PropertyInfo .
Os seguintes BindingFlags sinalizadores modificadores podem ser usados para alterar o funcionamento da pesquisa:
-
BindingFlags.DeclaredOnlypara pesquisar apenas as propriedades declaradas no Type, e não nas propriedades simplesmente herdadas.
Consulte System.Reflection.BindingFlags para obter mais informações.
No .NET 6 e versões anteriores, o método GetProperties não devolve propriedades numa ordem específica, como ordem alfabética ou de declaração. O seu código não deve depender da ordem em que as propriedades são devolvidas, porque essa ordem varia. No entanto, a partir do .NET 7, a ordenação é determinística com base na ordenação dos metadados na assembleia.
Se a corrente Type representa um tipo genérico construído, este método devolve os PropertyInfo objetos com os parâmetros de tipo substituídos pelos argumentos de tipo apropriados.
Se o current Type representa um parâmetro type na definição de um tipo genérico ou método genérico, esse método pesquisa as propriedades da restrição de classe.
Ver também
- PropertyInfo
- BindingFlags
- DefaultBinder
- GetProperty(String, BindingFlags, Binder, Type, Type[], ParameterModifier[])