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.