Wydaje się to dość proste, ale nie mogę go uruchomić. Mam obiekt i używam odbicia, aby dostać się do jego właściwości publicznych. Jedna z tych właściwości jest statyczna i nie udało mi się do niej dotrzeć.
Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo
Return obj.GetType.GetProperty(propName)
End Function
Powyższy kod działa dobrze dla właściwości Instancji Publicznej, które do tej pory są wszystkim, czego potrzebowałem. Podobno mogę użyć BindingFlags do zażądania innych typów właściwości (prywatnych, statycznych), ale nie mogę znaleźć odpowiedniej kombinacji.
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
Mimo to żądanie jakichkolwiek członków statycznych nic nie zwraca. Odbłyśnik .NET dobrze widzi właściwości statyczne, więc wyraźnie czegoś mi brakuje.
.net
reflection
static
Corey Downie
źródło
źródło
Odpowiedzi:
Albo po prostu spójrz na to ...
źródło
p.GetValue(null);
działa też. Druginull
nie jest wymagany.To jest C #, ale powinno dać ci pomysł:
(musisz LUB tylko niepubliczne i statyczne)
źródło
BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy
była jedyną rzeczą, która działała dla mnie.Trochę jasności ...
źródło
BindingFlags.Instance | BindingFlags.Static
rozwiązał to dla mnie.Ok, więc kluczem dla mnie było użycie FlattenHierarchy BindingFlag. Naprawdę nie wiem, dlaczego po prostu dodałem go z przeczucia i zaczęło działać. Ostatnim rozwiązaniem, które pozwala mi uzyskać instancję publiczną lub właściwości statyczne, jest:
źródło
Spowoduje to zwrócenie wszystkich statycznych właściwości w statycznej klasie bazowej lub określonego typu i prawdopodobnie również elementu podrzędnego.
źródło
Chciałem tylko to sobie wyjaśnić, korzystając z nowego interfejsu API refleksji opartego na
TypeInfo
- gdzieBindingFlags
nie jest dostępne niezawodnie (w zależności od docelowego frameworka).W `` nowym '' odbiciu, aby uzyskać właściwości statyczne dla typu (bez klas bazowych), musisz zrobić coś takiego:
Obsługuje zarówno właściwości tylko do odczytu, jak i tylko do zapisu (mimo że tylko zapis jest okropnym pomysłem).
DeclaredProperties
Członek też nie rozróżnia właściwości z publicznych / prywatnych dostępowych - tak aby filtrować widoczność dookoła, następnie trzeba to zrobić w oparciu o akcesor trzeba użyć. Np. - zakładając, że powyższe wezwanie powróciło, możesz:Dostępnych jest kilka metod skrótów - ale ostatecznie wszyscy będziemy pisać o wiele więcej metod rozszerzających dotyczących
TypeInfo
metod / właściwości zapytań w przyszłości. Ponadto nowy interfejs API zmusza nas do zastanowienia się nad tym, co od teraz uważamy za własność „prywatną” lub „publiczną” - ponieważ musimy filtrować się w oparciu o indywidualne metody dostępu.źródło
Poniższe wydaje się działać dla mnie.
źródło
Wypróbuj ten link odbicia C # .
Uwaga: Myślę, że BindingFlags.Instance i BindingFlags.Static są wyłączne.
źródło