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
{
get
{
return this._Name;
}
set
{
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
propertyBuilder.SetGetMethod(getter);
// 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
propertyBuilder.SetSetMethod(setter);
This post shows how to call base constructors.
