Framework to drastically simplify your private reflection code using C# dynamic
C# Batchfile
Switch branches/tags
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
src/ReflectionMagic
test Update test project Nov 1, 2017
.editorconfig Update editorconfig for project.json Nov 22, 2016
.gitattributes
.gitignore
LICENSE.txt
README.md Create README.md Mar 8, 2017
ReflectionMagic.sln Automatic migration of project.json Mar 9, 2017
ReflectionMagic.snk Restore strong name signing on build Nov 22, 2016
build-nuget.cmd Fix build script to output symbol package Nov 1, 2017

README.md

ReflectionMagic

Build status icon

Private reflection allows you to access private and internal members in other assemblies. Generally, it’s considered to be a bad thing to do, as it ties you to undocumented implementation details which can later break you. Also, it’s not usable in medium trust.

The purpose of this library is not to encourage anyone to use private reflection in situations where you would not have done it anyway. Instead, the purpose is to allow you to do it much more easily if you decide that you need to use it.

Putting it a different way, I’m not telling you to break the law, but I’m telling you how to break the law more efficiently if that’s what you’re into!

The scenario

Assume you are using an assembly that has code like this:

public class Foo1 
{
    private Foo2 GetOtherClass() 
    { 
        // Omitted
    }
}

internal class Foo2 
{
    private string SomeProp { get { /* Omitted */ } }
}

And assume you have an instance foo1 of the public class Foo1 and your evil self tells you that you want to call the private method GetOtherClass() and then get the SomeProp property off that.

Using reflection

Using plain old reflection this would be something like this:

object foo2 = typeof(Foo1).InvokeMember("GetOtherClass", 
                BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod,
                null, foo1, null);
                
PropertyInfo propInfo = foo2.GetType().GetProperty("SomeProp",    
                BindingFlags.Instance | BindingFlags.NonPublic);

string val = (string)propInfo.GetValue(foo2, null);

Which works, but is pretty ugly.

Using ReflectionMagic

Doing the same but using the ReflectionMagic library:

string val = foo1.AsDynamic().GetOtherClass().SomeProp;

More info

For more information look at the original blog post by David Ebbo: https://blogs.msdn.microsoft.com/davidebb/2010/01/18/use-c-4-0-dynamic-to-drastically-simplify-your-private-reflection-code/