首页 新闻 会员 周边

关于反射发出Emit

0
悬赏园豆:15 [待解决问题]
public class Person
{
public delegate void Load();
public Load hander;
public string Name { get; set; }
public string Age { get; set; }
public void SetPerson()
{
hander
= CreateLoad();
hander();
}
public void SetName()
{
Name
= "某某某";
}
public Load CreateLoad()
{
DynamicMethod method
= new DynamicMethod("SetName", null, null);
ILGenerator ilGenerator
= method.GetILGenerator();
ilGenerator.Emit(OpCodes.Ldloc_0);
ilGenerator.Emit(OpCodes.Ldstr,
"某某某");
ilGenerator.Emit(OpCodes.Callvirt,
this.GetType().GetProperty("Name").GetSetMethod());
ilGenerator.Emit(OpCodes.Ret);
return (Load)method.CreateDelegate(typeof(Load));
}
}
Person objP = new Person();
objP.SetPerson();

其实我就是想调用SetPerson方法,给Name属性赋值。但一直没有写正确。

请教高手这段emit代码该如何写?

davidwei的主页 davidwei | 初学一级 | 园豆:85
提问于:2011-04-30 01:42
< >
分享
所有回答(2)
0

this没有传递

有两个选择:

A、修改Load的签名,接受Person作为第一参数:

 

delegate void Load(Person p);

public Load CreateLoad()
{
DynamicMethod method
= new DynamicMethod("SetName", typeof(void), new Type[]{typeof(Person)});
ILGenerator ilGenerator
= method.GetILGenerator();
ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldstr,
"某某某");
ilGenerator.Emit(OpCodes.Callvirt,
this.GetType().GetProperty("Name").GetSetMethod());
ilGenerator.Emit(OpCodes.Ret);
return (Load)method.CreateDelegate(typeof(Load));
}

 

B、不修改Load签名,但是在创建委托时,将某一个Person对象绑定到委托的第一参数上:

 

public Load CreateLoad(Person p)
{
DynamicMethod method
= new DynamicMethod("SetName", typeof(void), new Type[]{typeof(Person)});
ILGenerator ilGenerator
= method.GetILGenerator();
ilGenerator.Emit(OpCodes.Ldarg_0);
ilGenerator.Emit(OpCodes.Ldstr,
"某某某");
ilGenerator.Emit(OpCodes.Callvirt,
this.GetType().GetProperty("Name").GetSetMethod());
ilGenerator.Emit(OpCodes.Ret);
return (Load)method.CreateDelegate(typeof(Load), p);
}

 

原来写了ldloc_0是直接copy过来忘记改了,修改成ldarg_0

Zhenway | 园豆:260 (菜鸟二级) | 2011-04-30 12:26
代码能编译,但运行不了。望高手指点下:
错误提示:
操作可能会破坏运行时稳定性。
支持(0) 反对(0) davidwei | 园豆:85 (初学一级) | 2011-05-01 23:35
@davidwei:
见修改
支持(0) 反对(0) Zhenway | 园豆:260 (菜鸟二级) | 2011-05-02 18:52
@
Zhenway: 还是不行,:)。错误提示:JIT 编译器遇到内部限制。
支持(0) 反对(0) davidwei | 园豆:85 (初学一级) | 2011-05-03 16:37
0

使用一个封装库处理这个很方便,参考 http://www.cnblogs.com/2018/archive/2011/01/17/1937564.html 

2012 | 园豆:21230 (高人七级) | 2011-05-03 08:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册