Access Private Members Of A Class Using Reflection

Setting or getting private variable is quite a corner scenario while developing a new application and mainly developers will always find a way to access the private variable. But there is a direct way where we can access the private variable using reflection without much of hassle

What is the real-world scenario where I would need to access a private variable?

In real-world scenario I don’t you may ever need to access private variable in your own application. If you do then you’ll simply change it access specifier.

UTC or TDD development you might find yourself in scenario where you need to access or change the value of private variable of a class. In UTCs we often do such things to by check some negative scenario or for some other reasons.

Third party DLL or library, we may need to access private variable of a third-party variable

These are the cases where I need to access private variable

How could we achieve this?

Quite simple, you just need to do some R&D with reflection classes and need to spend some time with Type class provided in .net framework.

Example

using System;  
using System.Collections;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
  
namespace CrossProjectDemo  
{  
    public class Car : IEnumerable  
    {  
        private string name = string.Empty;  
        private string prvtVariable = "PrivateVariable";  
  
        public string Name {  
            get { return name; }  
            set { name = value; }  
        }  
  
    }  
} 

As you can see there two private variables,

  1. name
  2. prvtVariable 

While name is being accessed in a public Property Name, prvtVariable will be accessed directly

Let’s see how,

First in your application import Reflection namespace

using System.Reflection; 

Then follow the code,

Car c = new Car();  
Type typ = typeof(Car);  
FieldInfo type = typ.GetField("prvtVariable", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);  
var value = type.GetValue(c);   

In the above image, you can see the type.IsPrivate is true which means the variable is private,

And we can access its value into the value variable.

That’s easy right.

Now, Let’s move towards how we can change its value. Lets’ make few changes to the existing code

Just add one-line right after Getvalue() method call,

var value = type.GetValue(c);  
type.SetValue(c, "Not so much");  

and now you have changed the value of a private variable,

Easy, isn’t it. So here we’re accessing private variables through reflection.

Thanks