Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can C# extension methods access private variables?

Is it possible to access an object's private variables using an extension method?

like image 538
Geo Avatar asked Oct 10 '09 16:10

Geo


2 Answers

No. You can do the same in an extension method as in a "normal" static method in some utility class.

So this extension method

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

is equivalent to some static helper method like this (at least regarding what you can access):

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

(Of course you could use some reflection in either method to access private members. But I guess that's not the point of this question.)

like image 196
M4N Avatar answered Sep 23 '22 19:09

M4N


No it cannot.

However, you will be interested to know that the other answers are incorrect in saying that normal static methods cannot access private fields. A static method can access private non-static member fields in its own class. The following code is perfectly valid and shows a static method accessing a private field:

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

Now... back to your question. You might think that an extension method should be able to do the same thing, given the (non-existent) "equivalence" to static methods that other answers claim exists. However, you cannot declare extension methods inside a nested class. So if you try to do the following:

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

You will get a compile error saying

Extension method must be defined in a top level static class; Extensions is a nested class

Note that, interestingly enough, removing the this keyword causes the code to compile fine. The reasons for this are discussed here:

  1. Why are extension methods only allowed in non-nested, non-generic static class?
  2. Why not allow Extension method definition in nested class?
like image 23
Zaid Masud Avatar answered Sep 26 '22 19:09

Zaid Masud