2009-12-29 5 views
0

Je suis nouveau pour les réflexions. J'ai besoin de créer une classe qui hérite d'une classe parente. Je dois créer une propriété readonly. Cette propriété appelle une fonction existante dans la classe parent en transmettant un argument 25.Réflexion IL Code

Tout fonctionne correctement, sauf que je ne peux pas transmettre la valeur 25 à la fonction appelée. Voici le code qui génère la classe. Veuillez aider. Merci.

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 
+2

Vous pouvez simplement écrire C# ce que vous voulez que du code ne compile ensuite et l'assemblage ouvert avec réflecteur et sélectionnez IL désassembleur. –

Répondre

5

Supposons que vous avez changé ceci:

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

dans ce:

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

LDC_I4_0 est un opcode qui charge la valeur "0". En revanche, LDC_I4 vous permet de spécifier l'argument lui-même.

(caveat: non testés, a ceci de lecture de la documentation)

+0

Que vous mon pote. Cela a fonctionné avec currGetIL.Emit (OpCodes.Ldc_I4, 25). Merci un million. –

+1

Bien sûr, vous pourriez récompenser la bonne réponse en la marquant comme acceptée. ;-) – Rytmis