Das scheint also ziemlich einfach zu sein, aber ich kann es nicht zum Laufen bringen. Ich habe ein Objekt und verwende Reflexion, um zu seinen öffentlichen Eigenschaften zu gelangen. Eine dieser Eigenschaften ist statisch und ich habe kein Glück, sie zu erreichen.
Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo
Return obj.GetType.GetProperty(propName)
End Function
Der obige Code funktioniert gut für Eigenschaften öffentlicher Instanzen, was bis jetzt alles ist, was ich benötigt habe. Angeblich kann ich BindingFlags verwenden, um andere Arten von Eigenschaften (privat, statisch) anzufordern, aber ich kann anscheinend nicht die richtige Kombination finden.
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
Wenn Sie jedoch statische Mitglieder anfordern, wird nichts zurückgegeben. Der .NET-Reflektor kann die statischen Eigenschaften gut erkennen, daher fehlt mir hier eindeutig etwas.
.net
reflection
static
Corey Downie
quelle
quelle
Antworten:
Oder schau dir das an ...
quelle
p.GetValue(null);
funktioniert auch. Der zweitenull
ist nicht erforderlich.Dies ist C #, sollte Ihnen aber die Idee geben:
(Sie müssen nur nicht öffentlich und statisch ODER)
quelle
BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy
war das einzige, was für mich funktioniert hat.Ein bisschen Klarheit ...
quelle
BindingFlags.Instance | BindingFlags.Static
löste es für mich.Ok, der Schlüssel für mich war die Verwendung des .FlattenHierarchy BindingFlag. Ich weiß nicht wirklich, warum ich es gerade hinzugefügt habe und es begann zu funktionieren. Die endgültige Lösung, mit der ich öffentliche Instanzen oder statische Eigenschaften erhalten kann, lautet:
quelle
Dadurch werden alle statischen Eigenschaften in der statischen Basisklasse oder einem bestimmten Typ und wahrscheinlich auch das untergeordnete Element zurückgegeben.
quelle
Ich wollte dies nur für mich selbst klären, während ich die neue Reflection-API verwendete, die auf
TypeInfo
- woBindingFlags
nicht zuverlässig verfügbar ist (abhängig vom Ziel-Framework).Um die statischen Eigenschaften für einen Typ (ohne Basisklasse (n)) zu erhalten, müssen Sie in der 'neuen' Reflexion Folgendes tun:
Bietet sowohl schreibgeschützte als auch schreibgeschützte Eigenschaften (obwohl das Nur-Schreiben eine schreckliche Idee ist).
Auch das
DeclaredProperties
Mitglied unterscheidet nicht zwischen Eigenschaften mit öffentlichen / privaten Accessoren. Um die Sichtbarkeit zu filtern, müssen Sie dies dann basierend auf dem Accessor tun, den Sie verwenden müssen. Beispiel: Wenn der obige Anruf zurückgekehrt ist, können Sie Folgendes tun:Es gibt einige Verknüpfungsmethoden - aber letztendlich werden wir alle in Zukunft viel mehr Erweiterungsmethoden um die
TypeInfo
Abfragemethoden / -eigenschaften schreiben . Außerdem zwingt uns die neue API, von nun an genau darüber nachzudenken, was wir als "privates" oder "öffentliches" Eigentum betrachten - weil wir uns nach einzelnen Zugriffsmethoden filtern müssen.quelle
Das Folgende scheint für mich zu funktionieren.
quelle
Versuchen Sie diesen C # Reflection Link.
Hinweis Ich denke, dass BindingFlags.Instance und BindingFlags.Static exklusiv sind.
quelle