Reflétant un domaine privé d'une classe de base
Voici la structure:
Maclasse : SuperClass2
SuperClass2 : SuperClass1
superClass2 est dans le Produit.Web et SuperClass1 est dans la .NET Système.Web de l'assemblée
Je suis en train de forcer une valeur dans un private bool champ sur SuperClass1. Mais n'importe ce que j'essaie je ne peux pas obtenir les champs de revenir de la réflexion.
Je suis en utilisant le code suivant avec différents BindingFlag combinaisons mais rien n'a fonctionné jusqu'à présent. SuperClass1 est une classe abstraite.
((SuperClass1)this).GetType().GetFields(System.Reflection.BindingFlags.NonPublic);
Notes:
Lorsque j'utilise GetProperties (), je reviens d'une belle grosse liste mais quand je spécifie tout bindingflags je ne reçois rien, même si il ya des propriétés correspondantes. Quel est le deal?
Aussi, le champ n'est pas marqué interne
Obvisouly, je serais en utilisant GetField(string nom, BindingFlags) mais je ne peux même pas obtenir GetFlags() fonctionne.
Mise à jour: j'ai essayé d'ajouter BindingFlags.Une Instance comme l'a suggéré, mais il ne fonctionne pas (comme prévu de toute façon). Je reviens de 2 champs qui sont à venir à partir de la classe SuperClass1 hérite. Retourne null quand il est utilisé avec GetField(string nom, Drapeaux)
Voici le code de la classe de base, je vais essayer d'obtenir le champ de
public abstract class BaseValidator : Label, IValidator
{
private bool propertiesChecked;
...
}
- Désolé pour la question stupide, mais pourquoi fais-tu cela? 🙂
- Grande question. En raison de Produit.Web.SuperClass2, je dois faire cela comme un travail autour de la prise en charge d'une fonction qu'ils doivent déjà prendre en charge, mais ne pas. Fondamentalement, l'API a une méthode virtuelle, mais TOUJOURS des appels à la base de la mise en œuvre. J'ai donc besoin de modifier la valeur du champ pour qu'il ne marche pas faire certaines vérifications afin que je puisse obtenir mon code à exécuter.
- Merci de ne pas demander "pourquoi voulez-vous faire cela?" -- il n'est pas utile ou implicite -- il y a un million de raisons valables pour le faire, et tous sont différents. Évidemment, les odeurs de code, mais le dogme ne va pas aider les 900 mille d'entre nous qui seront jetés là par l'intermédiaire de google.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez aller manuellement dans l'héritage de la chaîne pour obtenir la base de champs:
Compte tenu de ces classes:
Cela devrait fonctionner:
Il y a une solution générique dans cette SORTE de réponse: Ne pas obtenir les champs de GetType().GetFields avec BindingFlag.Par défaut
Dans une veine similaire à BrokenGlass de la solution, vous pourriez le faire pour le rendre un peu plus générique:
Et puis:
Comme une méthode utilitaire:
Et puis:
Je pense que vous devez ajouter le Système.De la réflexion.BindingFlags.Exemple drapeau. Utilisez | pour les combiner avec les Non publiques drapeau.
EDIT:
Ressemble BrokenGlass a droit. J'ai écrit ce test rapide.
Il indique correctement le domaine que vous recherchez. (Test est dérivé de BaseValidator)
Méthode d'Extension:
Si la hiérarchie est statique, le moyen le plus simple pour ce faire: