81

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

Geo
  • 93,257
  • 117
  • 344
  • 520

7 Answers7

78

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.)

M4N
  • 94,805
  • 45
  • 217
  • 260
  • 4
    +1. As an aside, you can have private extension methods; there's a nice article on this at http://odetocode.com/Blogs/scott/archive/2009/10/05/private-extension-methods.aspx Extension methods can also access private static members of their static utility class. – TrueWill Oct 10 '09 at 16:49
  • 3
    Even though this is tagged as C#, this applies to any of the .NET languages which provide support for extension methods. – Scott Dorman Oct 10 '09 at 17:25
  • 1
    @TrueWill - but since they must be static, non-nested, non-generic types, they can't really have private access to any *object's* variables. `internal` access, sure - but not `private`. – Marc Gravell Oct 10 '09 at 22:31
27

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?
Community
  • 1
  • 1
Zaid Masud
  • 13,225
  • 9
  • 67
  • 88
11

No:

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;
    }
}
Darin Dimitrov
  • 1,023,142
  • 271
  • 3,287
  • 2,928
10

Use Reflection

Not recommended, but you could possibly access any private variable of any type using another extension method like so:

public static T GetFieldValue<T>(this object obj, string name) {
    var field = obj.GetType().GetField(name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance);
    return (T)field?.GetValue(obj);
}

And then access a private field of an arbitrary type:

Foo foo = new Foo();
string privateBar = foo.GetFieldValue<string>("_bar");
Bruno Zell
  • 7,761
  • 5
  • 38
  • 46
3

No, unless you give some kind of access to them through public properties or a proxy pattern.

Yuriy Faktorovich
  • 67,283
  • 14
  • 105
  • 142
2

If you own the class that you are extending, you can always declare the class partial, then extend the class and have access to all the private members in a different file... But you wouldn't really be using extension methods.

Pang
  • 9,564
  • 146
  • 81
  • 122
1

An extension method is essentially a static method so all you have access to are the public members of the instance on which the extension method is invoked on

Abhijeet Patel
  • 6,562
  • 8
  • 50
  • 93