Created
December 5, 2012 19:55
-
-
Save floydpink/4218940 to your computer and use it in GitHub Desktop.
Creating dynamic types in VB.NET
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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