Reflection Emit: Creating Properties

For those who need to create a dynamic type in memory using Reflection.Emit and need to add some properties, here some code for copy-pasting 🙂

The generated code will be equivalent to the following C# code:

public class MyDynamicType
    private string _Name;

    public string Name
            return this._Name;
            this._Name = value;

And this is the code that generates it:

// Create a Type Builder that generates a type directly into the current AppDomain.
var appDomain = AppDomain.CurrentDomain;
var assemblyName = new AssemblyName("MyDynamicAssembly");
var assemblyBuilder = appDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave);
var moduleBuilder = assemblyBuilder.DefineDynamicModule(assemblyName.Name);

var typeBuilder = moduleBuilder.DefineType("MyDynamicType", TypeAttributes.Class | TypeAttributes.Public);

var propertyName = "Name";

// Generate a property called "Name"

var propertyType = typeof(string);
var field = typeBuilder.DefineField("_" + propertyName, propertyType, FieldAttributes.Private);
var propertyBuilder = typeBuilder.DefineProperty(propertyName, PropertyAttributes.HasDefault, propertyType, null);

// Generate getter method

var getter = typeBuilder.DefineMethod("get_" + name, GetSetAttr, propertyType, Type.EmptyTypes);

var il = getter.GetILGenerator();

il.Emit(OpCodes.Ldarg_0);        // Push "this" on the stack
il.Emit(OpCodes.Ldfld, field);   // Load the field "_Name"
il.Emit(OpCodes.Ret);            // Return


// Generate setter method

var setter = typeBuilder.DefineMethod("set_" + name, GetSetAttr, null, new[] { propertyType });

il = setter.GetILGenerator();

il.Emit(OpCodes.Ldarg_0);        // Push "this" on the stack
il.Emit(OpCodes.Ldarg_1);        // Push "value" on the stack
il.Emit(OpCodes.Stfld, field);   // Set the field "_Name" to "value"
il.Emit(OpCodes.Ret);            // Return


This post shows how to call base constructors.


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s