6

私はこのような方法を持っています:(これは一般的な方法でありDYNAMIC_CLASS_TYPE、状況によって他の状況に変更されます)

Dim res = f.MyMethod(Of DYNAMIC_CLASS_TYPE)("select Id, Name from myTable")

クエリの列に基づいて動的クラスを作成し、代わりにクラスを渡したいですDYNAMIC_CLASS_TYPE

これどうやってするの?

4

4 に答える 4

5

私はついにそれをすることに成功しました。私のコードは次のとおりです。

 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, o.Value, 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

関数の戻り値は、カスタム クラスのタイプです。

于 2014-11-17T11:05:09.653 に答える
2

バグがあるようです。私はこの行だと思います:

Dim field As FieldBuilder = myType.DefineField("_" + o.Key, GetType(Integer), FieldAttributes.[Private])

次のようになります。

Dim field As FieldBuilder = myType.DefineField("_" + o.Key, o.Value, FieldAttributes.[Private])

よろしく。

于 2014-12-16T07:29:36.697 に答える
-1

この行:

Dim field As FieldBuilder = myType.DefineField("_" + o.Key, GetType(Integer), FieldAttributes.[Private])

これに置き換える必要があります:

Dim field As FieldBuilder = myType.DefineField("_" + o.Key, o.Value, FieldAttributes.[Private])
于 2016-05-10T14:55:16.463 に答える
-1

はるかに簡単な方法は、System.Activator を使用することです。

Activator.CreateInstance(YourType, ParramArrayOfYourVariablesForNEW)

つまり、初期化で単一の文字列を取るクラス (Test) があるとします。

Public Class Test
    Public Sub New(byval MyString as string)
...

次のように新しいインスタンスを作成できます。

Activator.CreateInstance(gettype(Test),"My String")
于 2014-11-17T21:27:23.007 に答える