82 votes

Les méthodes d'extension C # peuvent-elles accéder à des variables privées?

Est-il possible d'accéder aux variables privées d'un objet à l'aide d'une méthode d'extension?

78voto

M4N Points 48758

Non, vous pouvez faire la même chose dans une méthode d'extension comme dans une méthode statique "normale" dans une classe d'utilitaires.

Donc, cette méthode d'extension

 public static void SomeMethod(this string s)
{
	// do something with 's'
}
 

est équivalent à une méthode d'assistance statique comme celle-ci (du moins en ce qui concerne ce à quoi vous pouvez accéder):

 public static void SomeStringMethod(string s)
{
	// do something with 's'
}
 

(Bien sûr, vous pouvez utiliser l'une ou l'autre méthode pour réfléchir aux membres privés. Mais je suppose que ce n'est pas le but de cette question.)

27voto

Zaid Masud Points 4536

Non, il ne le peut pas.

Cependant, vous serez intéressés de savoir que les autres réponses sont incorrectes en disant que la normale méthodes statiques ne peut pas accéder aux champs privés. Une méthode statique peut accès privé non-membre statique champs dans sa propre classe. Le code suivant est parfaitement valide et montre une méthode statique de l'accès à un champ privé:

public class Foo
{
    private bool _field;

    public static bool GetField(Foo foo)
    {
        return foo._field;
    }
}

Maintenant... revenir à votre question. Vous pourriez penser qu'une extension de la méthode doit être capable de faire la même chose, compte tenu de l' (inexistante) "équivalence" pour les méthodes statiques que d'autres réponses demande existe. Cependant, vous ne pouvez pas déclarer les méthodes d'extension à l'intérieur d'une classe imbriquée. Donc, si vous essayez d'effectuer les opérations suivantes:

public class Foo
{
    private bool _field;

    public static class Extensions
    {
        public static bool GetField(this Foo foo)
        {
            return foo._field;
        }
    }
}

Vous obtiendrez une erreur de compilation en disant:

Extension de la méthode doit être définie dans un haut niveau statique de la classe; Extensions est une classe imbriquée

Notez que, curieusement, en supprimant le mot clé "this" provoque le code se compile très bien. Les raisons pour cela sont discutés ici:

  1. Pourquoi les méthodes d'extension n'est permis dans la non-imbriquées, non générique statique de la classe?
  2. Pourquoi ne pas permettre l'Extension de la méthode de définition de classe imbriquée?

11voto

Darin Dimitrov Points 528142

Non:

 public class Foo
{
    private string bar;
}

public static class FooExtensions
{
    public static void Test(this Foo foo)
    {
        // Compile error here: Foo.bar is inaccessible due to its protection level  
        var bar = foo.bar;
    }
}
 

5voto

ASAF Points 21

3voto

Yuriy Faktorovich Points 33347

Non, sauf si vous leur donnez un accès quelconque via des propriétés publiques ou un modèle de proxy.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X