Est-il possible d'accéder aux variables privées d'un objet à l'aide d'une méthode d'extension?
Réponses
Trop de publicités?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.)
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:
Regardez cet exemple
http://www.codeproject.com/Articles/80343/Accessing-private-mivers.aspx