Reflection IL Code

Я новичок в размышлениях. Мне нужно создать класс, который наследуется от родительского класса. Мне нужно создать свойство только для чтения. Это свойство вызывает существующую функцию в родительском классе, передавая аргумент 25.

Все работает нормально, за исключением того, что я не могу передать значение 25 вызываемой функции. Ниже приведен код, который генерирует класс. Пожалуйста помогите. Благодарю.

    Public Shared Function GetDynamicClass() As Type
        Dim asmName As New AssemblyName
        asmName.Name = "MyAssm"

        Dim asmBuilder As AssemblyBuilder = Thread.GetDomain().DefineDynamicAssembly (asmName, AssemblyBuilderAccess.RunAndSave)
        Dim mdlBuilder As ModuleBuilder = asmBuilder.DefineDynamicModule("MyDynModule")

        Dim TypeBldr As TypeBuilder = mdlBuilder.DefineType("MyDynClass", TypeAttributes.[Public] Or TypeAttributes.[Class])
        TypeBldr.SetParent(GetType(MyParent))

        Dim PropertyName As String = ""
        Dim PropBldr As PropertyBuilder = Nothing
        Dim GetSetAttr As MethodAttributes = Nothing
        Dim currGetPropMthdBldr As MethodBuilder = Nothing
        Dim currGetIL As ILGenerator = Nothing
        Dim mi As MethodInfo = Nothing

        PropertyName = "SurveyDate"
        PropBldr = TypeBldr.DefineProperty(PropertyName, PropertyAttributes.None, GetType(Object), New Type() {GetType(Object)})
        GetSetAttr = MethodAttributes.[Public] Or MethodAttributes.HideBySig
        currGetPropMthdBldr = TypeBldr.DefineMethod("get_value", GetSetAttr, GetType(Object), Type.EmptyTypes)
        currGetIL = currGetPropMthdBldr.GetILGenerator()
        mi = GetType(MyParent).GetMethod("GetProgress")

        currGetIL.DeclareLocal(GetType(Object))
        currGetIL.Emit(OpCodes.Ldarg_0)
        currGetIL.Emit(OpCodes.Ldc_I4_0)
        currGetIL.Emit(OpCodes.Conv_I8)
        currGetIL.Emit(OpCodes.Call, mi)

        currGetIL.Emit(OpCodes.Ret)
        PropBldr.SetGetMethod(currGetPropMthdBldr)

        Return TypeBldr.CreateType

    End Function

1 ответ

Предположим, вы изменили это:

    currGetIL.Emit(OpCodes.Ldc_I4_0)
    currGetIL.Emit(OpCodes.Conv_I8)

в это:

    currGetIL.Emit(OpCodes.Ldc_I4, 25)
    currGetIL.Emit(OpCodes.Conv_I8)

LDC_I4_0 - это код операции, который загружает значение "0". LDC_I4, с другой стороны, позволяет вам указать фактический аргумент самостоятельно.

(Предостережение: не проверено, получил это от чтения документов)

Другие вопросы по тегам