Skip to content

Instantly share code, notes, and snippets.

@arc95
Created September 20, 2024 13:57
Show Gist options
  • Save arc95/992174a3655b74be9fc980a5ca2d2c2a to your computer and use it in GitHub Desktop.
Save arc95/992174a3655b74be9fc980a5ca2d2c2a to your computer and use it in GitHub Desktop.
using System;
using System.Reflection;
using System.Reflection.Emit;
class Program
{
static void Main()
{
var myType = CreateDynamicType();
var myObject = Activator.CreateInstance(myType);
var nameProperty = myType.GetProperty("Name");
nameProperty.SetValue(myObject, "Jane Doe");
Console.WriteLine($"Name: {nameProperty.GetValue(myObject)}");
}
static Type CreateDynamicType()
{
var assemblyName = new AssemblyName("DynamicAssembly");
var assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
var moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule");
var typeBuilder = moduleBuilder.DefineType("DynamicType", TypeAttributes.Public);
var fieldBuilder = typeBuilder.DefineField("_name", typeof(string), FieldAttributes.Private);
var propertyBuilder = typeBuilder.DefineProperty("Name", PropertyAttributes.HasDefault, typeof(string), null);
var getMethodBuilder = typeBuilder.DefineMethod("get_Name", MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, typeof(string), Type.EmptyTypes);
var getIL = getMethodBuilder.GetILGenerator();
getIL.Emit(OpCodes.Ldarg_0);
getIL.Emit(OpCodes.Ldfld, fieldBuilder);
getIL.Emit(OpCodes.Ret);
var setMethodBuilder = typeBuilder.DefineMethod("set_Name", MethodAttributes.Public | MethodAttributes.SpecialName | MethodAttributes.HideBySig, null, new[] { typeof(string) });
var setIL = setMethodBuilder.GetILGenerator();
setIL.Emit(OpCodes.Ldarg_0);
setIL.Emit(OpCodes.Ldarg_1);
setIL.Emit(OpCodes.Stfld, fieldBuilder);
setIL.Emit(OpCodes.Ret);
propertyBuilder.SetGetMethod(getMethodBuilder);
propertyBuilder.SetSetMethod(setMethodBuilder);
return typeBuilder.CreateType();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment