2010-04-14 4 views
0

Comment accéder à la valeur de la propriété d'une classe interne, voir ci-dessous?Accéder à la valeur de la propriété d'une classe d'une autre classe interne en C#

namespace N1 
{ 
    public class ClassA 
    { 
     string var1 = null; 
     private ClassB b; 
     public ClassA() 
     { 
      var1 = "one"; 
      b = new ClassB(); 
     } 
     //property 
     public string Var1 
     { 
      get{ return var1; } 
     } 
} 

namespace N1 
{ 
    internal class ClassB 
    { 
    private void method() 
    { 
     // I need to access the value of Var1(property) from here, how to do this? 
    } 
    } 
} 

Répondre

0

Vous avez besoin d'une référence à une instance de la classe A.

Donc, soit le changement constructeur de classe B d'accepter une référence à la classe A

namespace N1 
{ 
    public class ClassA 
    { 
     string var1 = null; 
     private ClassB b; 
     public ClassA() 
     { 
      var1 = "one"; 
      b = new ClassB(this); 
     } 
     //property 
     public string Var1 
     { 
      get { return var1; } 
     } 
    } 
} 

namespace N1 
{ 
    internal class ClassB 
    { 
     ClassA classA; 
     public ClassB(ClassA classARef) 
     { 
      classA = classARef; 
     } 

    private void method() 
    { 
     // I need to access the value of Var1(property) from here, how to do this? 
     string myString = classA.Var1; 
    } 
    } 
} 

ou de rendre la méthode privée de classeB() prendre une chaîne? private void method(string classAVar1)

ou faire statique ClassA (haha)

-2

Vous ne pouvez pas. Modifiez les modificateurs d'accès de classe A ou B. Le but de la classe interne est de contenir une implémentation de logique interne, et si vous avez besoin d'accéder aux champs des classes publiques, il est probable que quelque chose ne va pas avec la conception de l'application

+0

Je pense que les commentaires sur le bas-voix doivent être rendues obligatoires - mais je digresse. Je n'ai pas voté en bas mais je me demandais si vous vouliez dire des classes imbriquées – Asher

0

de deux manières:

  1. Modifiez le modificateur d'accès de ClassB.Method pour le rendre public et faites-lui prendre un paramètre de chaîne.
  2. Mettez à jour le constructeur de ClassB pour prendre un paramètre de chaîne et le stocker dans un champ privé. Ajouter une propriété de chaîne publique à ClassB.

La création d'une classe internal signifie simplement que la classe n'est disponible qu'avec les fichiers d'un même assemblage.

+0

Mon idée de rendre la classe B interne est que le client utilise assebmbly N'accède qu'aux propriétés et méthodes de la classe A. Le client ne devrait pas avoir accès à quoi que ce soit dans la classe B – myWorld

+0

@ starz26: Pour que 'ClassB' ne soit accessible à' ClassA' qu'en interne, placez-le dans ClassA'. Pour le rendre accessible à toutes les autres classes de l'assemblage, mais pas accessible à l'extérieur, il suffit de le marquer comme 'internal'. – James

1

Passer une instance de ClassA dans le constructeur de classe B:

namespace N1 
{ 
    internal class ClassB 
    { 
    private ClassA _classAInstance; 

    public void ClassB(ClassA classAInstance) 
    { 
     _classAInstance = classAInstance; 
    } 

    private void method() 
    { 
     // You can access _classAInstance properties here 
    } 

    } 
} 

Mise à jour: j'ai raté une instance ClassB b était un membre privé ClassA. En utilisant ma réponse précédente, vous pouvez simplement instancier b dans le constructeur de ClasseA:

public ClassA() 
    { 
     var1 = "one"; 
     b = new ClassB(this); 
    } 
+0

Si c'est pour accéder à la valeur de 1 propriété, je déconseillerais probablement de prendre en classe complète. – James

+0

@Jamie: Je pensais dans les lignes d'instancier la classe à l'intérieur de la méthode. Cool implémentation – Raja

+0

@James - Cela fonctionne aussi mais ne fournit pas de contexte. Vous pouvez passer n'importe quelle chaîne dans le constructeur; Ma réponse limite l'accès de ClassB aux propriétés et aux méthodes de ClassA. –

Questions connexes