我有一个这样的方法:(这是一个通用的方法,DYNAMIC_CLASS_TYPE将在情况下改为其他情况) Dim res = f.MyMethod(Of DYNAMIC_CLASS_TYPE)("select Id, Name from myTable") 我想基于我的查询列创建一个动态类,然后传
Dim res = f.MyMethod(Of DYNAMIC_CLASS_TYPE)("select Id, Name from myTable")
我想基于我的查询列创建一个动态类,然后传递该类而不是DYNAMIC_CLASS_TYPE.
我怎样才能做到这一点?
我终于成功了.我的代码如下:Public Shared Function CreateClass(ByVal className As String, ByVal properties As Dictionary(Of String, Type)) As Type Dim myDomain As AppDomain = AppDomain.CurrentDomain Dim myAsmName As New AssemblyName("MyAssembly") Dim myAssembly As AssemblyBuilder = myDomain.DefineDynamicAssembly(myAsmName, AssemblyBuilderAccess.Run) Dim myModule As ModuleBuilder = myAssembly.DefineDynamicModule("MyModule") Dim myType As TypeBuilder = myModule.DefineType(className, TypeAttributes.Public) myType.DefineDefaultConstructor(MethodAttributes.Public) For Each o In properties Dim prop As PropertyBuilder = myType.DefineProperty(o.Key, PropertyAttributes.HasDefault, o.Value, Nothing) Dim field As FieldBuilder = myType.DefineField("_" + o.Key, GetType(Integer), FieldAttributes.[Private]) Dim getter As MethodBuilder = myType.DefineMethod("get_" + o.Key, MethodAttributes.[Public] Or MethodAttributes.SpecialName Or MethodAttributes.HideBySig, o.Value, Type.EmptyTypes) Dim getterIL As ILGenerator = getter.GetILGenerator() getterIL.Emit(OpCodes.Ldarg_0) getterIL.Emit(OpCodes.Ldfld, field) getterIL.Emit(OpCodes.Ret) Dim setter As MethodBuilder = myType.DefineMethod("set_" + o.Key, MethodAttributes.[Public] Or MethodAttributes.SpecialName Or MethodAttributes.HideBySig, Nothing, New Type() {o.Value}) Dim setterIL As ILGenerator = setter.GetILGenerator() setterIL.Emit(OpCodes.Ldarg_0) setterIL.Emit(OpCodes.Ldarg_1) setterIL.Emit(OpCodes.Stfld, field) setterIL.Emit(OpCodes.Ret) prop.SetGetMethod(getter) prop.SetSetMethod(setter) Next Return myType.CreateType() End Function
函数的返回值是我的自定义类的类型.