Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the value of private field using reflection?

Tags:

c#

reflection

I ran into a problem that I need to access to private field of a class. For example:

class MyClass  {     private string someString;      public MyClass( string someStringValue )     {         someString = someStringValue;     } } 

How can I get the value of someString outside MyClass ?

Update:

Sorry, I cannot use property here since the the actual production code is protected. I'm a QA/Dev, I need a way to get those private for writing User Acceptance Test. So I cannot change production code. Can you help?

like image 308
Chan Avatar asked Jul 21 '10 19:07

Chan


People also ask

Is it possible to get information about private fields methods using reflection?

Yes it is possible.


1 Answers

As others have said, since the field is private you should not be trying to get it with normal code. The only time this is acceptable is during unit testing, and even then you need a good reason to do it (such as setting a private variable to null so that code in an exception block will be hit and can be tested).

You could use something like the method below to get the field:

/// <summary> /// Uses reflection to get the field value from an object. /// </summary> /// /// <param name="type">The instance type.</param> /// <param name="instance">The instance object.</param> /// <param name="fieldName">The field's name which is to be fetched.</param> /// /// <returns>The field value from the object.</returns> internal static object GetInstanceField(Type type, object instance, string fieldName) {     BindingFlags bindFlags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic         | BindingFlags.Static;     FieldInfo field = type.GetField(fieldName, bindFlags);     return field.GetValue(instance); } 

So you could call this like:

string str = GetInstanceField(typeof(YourClass), instance, "someString") as string; 

Again, this should not be used in most cases.

like image 125
dcp Avatar answered Sep 18 '22 14:09

dcp