Reflection.Emit 动态创建方法
我想动态创建一些方法,该方法将接受单个参数 - 类 A 的实例,然后在传递的 A 实例中执行方法 B。B 具有 int 类型的参数。所以这是架构:
dynamicMethod(A a){
a.B(12);
}
这是我尝试过的:
DynamicMethod method = new DynamicMethod(string.Empty, typeof(void), new[] { typeof(A) }, typeof(Program));
MethodInfo methodB = typeof(A).GetMethod("B", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { }, null);
ILGenerator gen = method.GetILGenerator();
gen.Emit(OpCodes.Nop);
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldarg_S, 100);
gen.Emit(OpCodes.Call, methodB);
但编译器告诉我 CLR 没有找到该方法。你能帮我吗?
I'd like to create dynamically some method, which will accept single parameter - instance of class A and then will execute method B in passed instance of A. B has parameter of type int. So here is the schema:
dynamicMethod(A a){
a.B(12);
}
Here what I tried:
DynamicMethod method = new DynamicMethod(string.Empty, typeof(void), new[] { typeof(A) }, typeof(Program));
MethodInfo methodB = typeof(A).GetMethod("B", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, new Type[] { }, null);
ILGenerator gen = method.GetILGenerator();
gen.Emit(OpCodes.Nop);
gen.Emit(OpCodes.Ldarg_0);
gen.Emit(OpCodes.Ldarg_S, 100);
gen.Emit(OpCodes.Call, methodB);
But compiler tells me that CLR doesn't found the method. Could you help me with it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
MSDN 关于Type.GetMethod 函数的类型参数:
您传递一个空数组,表示“不带参数的方法”。但正如你所说“B 有一个 int 类型的参数。”
这会起作用:
如果我理解正确
Ldarg_S
将加载方法的第一百个参数,类似于 Ldarg_0:要加载常量值,请使用 Ldc_I4
MSDN about the types parameter of the Type.GetMethod function:
You pass an empty array which indicates "a method that takes no parameters". But as you said "B has [a] parameter of type int."
This will work:
If I understand correctly
Ldarg_S
will load the one hundredth argument of your method, similiarly to Ldarg_0:For loading a constant value use Ldc_I4