Skip to content

Instantly share code, notes, and snippets.

@floydpink
Created December 5, 2012 19:55
Show Gist options
  • Save floydpink/4218940 to your computer and use it in GitHub Desktop.
Save floydpink/4218940 to your computer and use it in GitHub Desktop.
Creating dynamic types in VB.NET
Public Function Build() As String
Dim json = String.Empty
Dim assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(New AssemblyName(_topLevelObjectName), AssemblyBuilderAccess.RunAndSave)
Dim moduleBuilder = assemblyBuilder.DefineDynamicModule(_topLevelObjectName, String.Format("{0}.dll", _topLevelObjectName))
Dim typeBuilder = moduleBuilder.DefineType(_topLevelObjectName, TypeAttributes.Class Or TypeAttributes.Public)
Dim constructorBuilder = typeBuilder.DefineConstructor(MethodAttributes.Public,
CallingConventions.Standard,
Nothing)
Dim constructorIL = constructorBuilder.GetILGenerator()
constructorIL.Emit(OpCodes.Ldarg_0)
constructorIL.Emit(OpCodes.Call, GetType(Object).GetConstructor(Type.EmptyTypes))
constructorIL.Emit(OpCodes.Ret)
For Each constant In Types.Constants
Dim field = typeBuilder.DefineField(String.Format("_{0}", constant.Name),
constant,
FieldAttributes.Private)
Const getSetAttributes As MethodAttributes = MethodAttributes.Public Or MethodAttributes.SpecialName Or MethodAttributes.HideBySig
Dim getter = typeBuilder.DefineMethod(String.Format("get_{0}", constant.Name),
getSetAttributes,
constant,
Type.EmptyTypes)
Dim propertyGetterIL = getter.GetILGenerator()
propertyGetterIL.Emit(OpCodes.Ldarg_0)
propertyGetterIL.Emit(OpCodes.Ldfld, field)
propertyGetterIL.Emit(OpCodes.Ret)
Dim setter = typeBuilder.DefineMethod(String.Format("set_{0}", constant.Name),
getSetAttributes,
Nothing,
New Type() {constant})
Dim numberSetIL = setter.GetILGenerator()
numberSetIL.Emit(OpCodes.Ldarg_0)
numberSetIL.Emit(OpCodes.Ldarg_1)
numberSetIL.Emit(OpCodes.Stfld, field)
numberSetIL.Emit(OpCodes.Ret)
Dim propertyBuilder = typeBuilder.DefineProperty(constant.Name, PropertyAttributes.HasDefault, constant, Nothing)
propertyBuilder.SetGetMethod(getter)
propertyBuilder.SetSetMethod(setter)
Next
Dim typeInstance = typeBuilder.CreateType()
assemblyBuilder.Save(String.Format("{0}.dll", assemblyBuilder.GetName().Name))
Dim instance = Activator.CreateInstance(typeInstance)
json = JsonConvert.SerializeObject(instance, Formatting.Indented)
Return json
End Function
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment