Isso parece muito básico, mas não consigo fazer funcionar. Eu tenho um objeto e estou usando reflexão para chegar às suas propriedades públicas. Uma dessas propriedades é estática e não estou tendo sorte em chegar a ela.
Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo
Return obj.GetType.GetProperty(propName)
End Function
O código acima funciona bem para propriedades de instância pública, que até agora é tudo o que eu precisava. Supostamente, posso usar BindingFlags para solicitar outros tipos de propriedades (privadas, estáticas), mas não consigo encontrar a combinação certa.
Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo
Return obj.GetType.GetProperty(propName, Reflection.BindingFlags.Static Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public)
End Function
Mesmo assim, solicitar qualquer membro estático não retornará nada. O refletor .NET pode ver as propriedades estáticas perfeitamente, então é claro que estou perdendo algo aqui.
.net
reflection
static
Corey Downie
fonte
fonte
Respostas:
Ou apenas olhe isso ...
fonte
p.GetValue(null);
funciona também. O segundonull
não é obrigatório.Isso é C #, mas deve lhe dar uma ideia:
(você precisa OR não público e estático apenas)
fonte
BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy
foi a única coisa que funcionou para mim.Um pouco de clareza ...
fonte
BindingFlags.Instance | BindingFlags.Static
resolveu para mim.Ok, então a chave para mim era usar o .FlattenHierarchy BindingFlag. Eu realmente não sei por que eu apenas adicionei por um palpite e começou a funcionar. Portanto, a solução final que me permite obter uma instância pública ou propriedades estáticas é:
fonte
Isso retornará todas as propriedades estáticas na classe base estática ou um tipo específico e provavelmente o filho também.
fonte
Só queria esclarecer isso para mim, ao usar a nova API de reflexão baseada em
TypeInfo
- ondeBindingFlags
não está disponível de forma confiável (dependendo da estrutura de destino).No 'novo' reflexo, para obter as propriedades estáticas de um tipo (não incluindo a (s) classe (s) base), você deve fazer algo como:
Atende propriedades somente leitura ou somente gravação (apesar de somente gravação ser uma ideia terrível).
O
DeclaredProperties
membro também não distingue entre propriedades com acessores públicos / privados - portanto, para filtrar a visibilidade, você precisa fazer isso com base no acessador que precisa usar. Por exemplo, supondo que a chamada acima tenha retornado, você pode fazer:Existem alguns métodos de atalho disponíveis - mas, no final das contas, todos nós iremos escrever muito mais métodos de extensão em torno dos
TypeInfo
métodos / propriedades de consulta no futuro. Além disso, a nova API nos força a pensar exatamente no que consideramos uma propriedade 'privada' ou 'pública' a partir de agora - porque devemos nos filtrar com base em acessadores individuais.fonte
O abaixo parece funcionar para mim.
fonte
Experimente este link C # Reflection .
Observe que BindingFlags.Instance e BindingFlags.Static são exclusivos.
fonte