using System.Reflection.Emit;
public static void Main()
DefineEmRuntimeUmaClasseHerdandoOutra();
public static void DefineEmRuntimeUmaClasseHerdandoOutra() {
AssemblyName aName = new AssemblyName("DynamicAssemblyExample");
AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(aName, AssemblyBuilderAccess.RunAndSave);
ModuleBuilder mb = ab.DefineDynamicModule(aName.Name, aName.Name + ".dll");
Type typeClasseA = Type.GetType("ClasseA");
TypeBuilder tb = mb.DefineType("ClasseB", TypeAttributes.Public, typeClasseA);
FieldInfo codigo = typeClasseA.GetField("_codigo", BindingFlags.NonPublic | BindingFlags.Instance);
FieldInfo atributo = typeClasseA.GetField("_atributo", BindingFlags.NonPublic | BindingFlags.Instance);
Type[] parameterTypes = {typeof(int)};
ConstructorBuilder ctor1 = tb.DefineConstructor(
CallingConventions.Standard,
ILGenerator ctor1IL = ctor1.GetILGenerator();
ctor1IL.Emit(OpCodes.Ldarg_0);
ctor1IL.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes));
ctor1IL.Emit(OpCodes.Ldarg_0);
ctor1IL.Emit(OpCodes.Ldarg_1);
ctor1IL.Emit(OpCodes.Stfld, codigo);
ctor1IL.Emit(OpCodes.Ret);
Type[] parameterTypes2 = { typeof(int), typeof(string)};
ConstructorBuilder ctor2 = tb.DefineConstructor(
CallingConventions.Standard,
ILGenerator ctor2IL = ctor2.GetILGenerator();
ctor2IL.Emit(OpCodes.Ldarg_0);
ctor2IL.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes));
ctor2IL.Emit(OpCodes.Ldarg_0);
ctor2IL.Emit(OpCodes.Ldarg_1);
ctor2IL.Emit(OpCodes.Stfld, codigo);
ctor2IL.Emit(OpCodes.Ldarg_0);
ctor2IL.Emit(OpCodes.Ldarg_2);
ctor2IL.Emit(OpCodes.Stfld, atributo);
ctor2IL.Emit(OpCodes.Ret);
Type ClasseBType = tb.CreateType();
ClasseA objClasseB = (ClasseA)System.Activator.CreateInstance(ClasseBType, 1, "Rá!");
Console.WriteLine(objClasseB.Concatena());
protected string _atributo;
protected string Atributo
set {_atributo = value; }
public ClasseA (int codigo)
public string Concatena()
return this.Atributo + " - " + this.Codigo;