2010-12-02 4 views
4

Je souhaite accéder au membre protégé d'une classe. Y a-t-il un moyen simple?Comment lire un membre protégé

+7

La plupart du temps, il est protégé pour une raison ... –

+0

Quelle est la relation entre la classe où vous l'avez accès à la classe avec le membre protégé? – MerickOWA

+3

@Mehrdad Afshari: Et quand ce n'est pas que nous devons le pirater à droite?:) Les mauvais designs sont parfois hors de notre contrôle. –

Répondre

9

Il y a deux façons:

  1. créer une sous-classe de la classe dont les membres protégés que vous souhaitez accéder.
  2. Utiliser la réflexion.

# 1 ne fonctionne que si vous contrôlez qui crée les instances de la classe. Si une instance déjà construite vous est remise, alors # 2 est la seule solution viable.

Personnellement, je m'assurerais que j'ai épuisé tous les autres mécanismes possibles de mise en œuvre de votre fonctionnalité avant de recourir à la réflexion, cependant.

0

Si vous pouvez dériver de la classe qui a ce membre protégé que vous pouvez y accéder.
En ce qui concerne l'utilisation de la réflexion, this might help.

0

Avez-vous choisi le bon accessoire pour votre membre?

  1. protected (C# Reference);
  2. public (C# Reference);
  3. private (C# Reference);
  4. internal (C# Reference).
  5. Vous pouvez également combiner interne avec protégé.

Par tous les moyens, le protégé accesseur précise qu'un membre est accessible uniquement dans une classe dérivée. Donc, si votre objectif est d'y accéder en dehors d'une classe dérivée, peut-être devriez-vous plutôt envisager d'utiliser le public ou interne accesseur !? En outre, cela est possible jusqu'à Reflection (C# and Visual Basic).

D'autre part, si vous voulez vraiment exposer les protégées membres d'une classe, je voudrais essayer d'utiliser publics membres et en retournant une référence à la protégée à travers elle.

Mais s'il vous plaît, posez-vous la question si votre conception est bonne avant d'exposer protégés membres. Ça me ressemble comme une odeur de design.

1

J'ai parfois eu besoin de faire exactement cela. Lors de l'utilisation de WinForms, il existe des valeurs dans les classes système auxquelles vous souhaitez accéder, mais qui ne le peuvent pas parce qu'elles sont privées. Pour contourner cela, j'utilise la réflexion pour y avoir accès. Par exemple ...

// Example of a class with internal private field 
    public class ExampleClass 
    { 
     private int example; 
    } 

    private static FieldInfo _fiExample; 

    private int GrabExampleValue(ExampleClass instance) 
    { 
     // Only need to cache reflection info the first time needed    
     if (_fiExample == null) 
     { 
      // Cache field info about the internal 'example' private field 
      _fiExample = typeof(ExampleClass).GetField("example", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetField); 
     } 

     // Grab the internal property 
     return (int)_fiExample.GetValue(instance); 
    } 
Questions connexes