Cela semble donc assez basique mais je ne peux pas le faire fonctionner. J'ai un objet et j'utilise la réflexion pour accéder à ses propriétés publiques. L'une de ces propriétés est statique et je n'ai pas de chance d'y arriver.
Public Function GetProp(ByRef obj As Object, ByVal propName as String) as PropertyInfo
Return obj.GetType.GetProperty(propName)
End Function
Le code ci-dessus fonctionne très bien pour les propriétés d'instance publique, ce qui jusqu'à présent est tout ce dont j'avais besoin. On suppose que je peux utiliser BindingFlags pour demander d'autres types de propriétés (privées, statiques), mais je n'arrive pas à trouver la bonne combinaison.
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
Mais quand même, demander à des membres statiques ne renvoie rien. Le réflecteur .NET peut voir les propriétés statiques très bien, donc il me manque clairement quelque chose ici.
.net
reflection
static
Corey Downie
la source
la source
Réponses:
Ou regardez simplement ceci ...
la source
p.GetValue(null);
fonctionne aussi. Le secondnull
n'est pas obligatoire.Ceci est C #, mais devrait vous donner l'idée:
(vous devez OU non public et statique uniquement)
la source
BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy
était la seule chose qui fonctionnait pour moi.Un peu de clarté ...
la source
BindingFlags.Instance | BindingFlags.Static
résolu pour moi.Ok donc la clé pour moi était d'utiliser le .FlattenHierarchy BindingFlag. Je ne sais pas vraiment pourquoi je l'ai simplement ajouté par intuition et que cela a commencé à fonctionner. Donc, la solution finale qui me permet d'obtenir une instance publique ou des propriétés statiques est:
la source
Cela retournera toutes les propriétés statiques dans la classe de base statique ou un type particulier et probablement aussi l'enfant.
la source
Je voulais juste clarifier cela pour moi-même, tout en utilisant la nouvelle API de réflexion basée sur
TypeInfo
- oùBindingFlags
n'est pas disponible de manière fiable (en fonction du cadre cible).Dans la `` nouvelle '' réflexion, pour obtenir les propriétés statiques d'un type (sans inclure les classes de base), vous devez faire quelque chose comme:
Convient à la fois aux propriétés en lecture seule ou en écriture seule (bien que l'écriture seule soit une mauvaise idée).
Le
DeclaredProperties
membre ne fait pas non plus la distinction entre les propriétés avec des accesseurs publics / privés - donc pour filtrer autour de la visibilité, vous devez ensuite le faire en fonction de l'accesseur que vous devez utiliser. Par exemple, en supposant que l'appel ci-dessus est retourné, vous pouvez faire:Il existe des méthodes de raccourci disponibles - mais en fin de compte, nous allons tous écrire beaucoup plus de méthodes d'extension autour des
TypeInfo
méthodes / propriétés de requête à l'avenir. De plus, la nouvelle API nous oblige à réfléchir à ce que nous considérons désormais comme une propriété «privée» ou «publique», car nous devons nous filtrer en fonction des accesseurs individuels.la source
Le ci-dessous semble fonctionner pour moi.
la source
Essayez ce lien de réflexion C # .
Notez que je pense que BindingFlags.Instance et BindingFlags.Static sont exclusifs.
la source