.net 在Reflection.Emit IL中,下面的代码与什么是等价的
我有以下几点.net 在Reflection.Emit IL中,下面的代码与什么是等价的,.net,reflection,cil,reflection.emit,il,.net,Reflection,Cil,Reflection.emit,Il,我有以下几点 void DoSomething(Data data){ var myDataRequest = new DataRequest(); myDataRequest.ID = data.ID } 但它似乎不起作用 代码,我真的想生成: methodIL.Emit(OpCodes.Ldloc_1); methodIL.Emit(OpCodes.Ldarg_0); methodIL.Emit(OpCodes.Callvirt, getMethodForData);
void DoSomething(Data data){
var myDataRequest = new DataRequest();
myDataRequest.ID = data.ID
}
但它似乎不起作用
代码,我真的想生成:
methodIL.Emit(OpCodes.Ldloc_1);
methodIL.Emit(OpCodes.Ldarg_0);
methodIL.Emit(OpCodes.Callvirt, getMethodForData);
methodIL.Emit(OpCodes.Callvirt, setMethodForDataRequest);
methodIL.Emit(OpCodes.Nop);
简单,编译您的方法并使用一些反编译器(Reflector甚至LINQPad)来读取IL。我得到了以下信息:
methodIL.Emit(OpCodes.Ldloc_1);
methodIL.Emit(OpCodes.Ldarg_1);
methodIL.Emit(OpCodes.Callvirt, getMethodForData);
methodIL.Emit(OpCodes.Callvirt, setMethodForDataRequest);
methodIL.Emit(OpCodes.Nop);
编辑:以下代码适用于我:
IL_0000: newobj DataRequest..ctor
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: ldarg.1
IL_0008: callvirt Data.get_ID
IL_000D: callvirt DataRequest.set_ID
IL_0012: ret
公共类数据请求
{
公共数据请求()
{}
私人国际货币单位id;
公共整数ID
{
获取{return m_id;}
设置{m_id=value;}
}
}
公共类数据
{
私人国际货币单位id;
公共整数ID
{
获取{return m_id;}
设置{m_id=value;}
}
}
班级计划
{
静态void Main()
{
var方法=新的动态方法(“DoSomething”,typeof(void),new[]{typeof(Data)});
var methodIL=method.GetILGenerator();
var constructor=typeof(DataRequest).GetConstructor(新类型[0]);
var getMethodForData=typeof(Data).GetProperty(“ID”).getMethod();
var setMethodForDataRequest=typeof(DataRequest).GetProperty(“ID”).GetSetMethod();
methodIL.Emit(操作码.Newobj,构造函数);
//存储同一对象并将其加载到某个本地服务器是没有用的
//var dataReuqest=methodIL.DeclareLocal(typeof(DataRequest));
//methodIL.Emit(opcode.Stloc、dataReuqest.LocalIndex);
//methodIL.Emit(opcode.Ldloc、dataReuqest.LocalIndex);
methodIL.Emit(操作码Ldarg_0);
methodIL.Emit(opcode.Callvirt,getMethodForData);
methodIL.Emit(opcode.Callvirt,setMethodForDataRequest);
发射方法(操作码Ret);
var f=(Action)method.CreateDelegate(typeof(Action));
var data=新数据{ID=42};
f(数据);
}
}
也许你忘了声明你正在使用的局部变量?这也是我上面的代码。我只显示了reflection.emit代码get和set。我已经有了新的OBJ,但它仍然不工作它怎么不工作?它有什么作用?你如何使用发出的代码?看看我对原始帖子所做的更改,我注意到你没有使用操作码。Ldloc。我会试试看,除非它不起作用。看看你贴的代码。它会做一些不同于我想要的事情。new DataRequest().ID=data.idi如果您使用的是.net 4,那么您可以基于表达式树编译方法,这很容易创建。我之所以使用reflection.emit,是因为我正在基于接口方法生成一个类。表达式树不适合这种情况。我认为可以将表达式树编译到现有的methodbuilder中。这可能允许您实现一个接口。查看指向我发布的代码的链接,是否可以将其转换为表达式树?
IL_0000: newobj DataRequest..ctor
IL_0005: stloc.0
IL_0006: ldloc.0
IL_0007: ldarg.1
IL_0008: callvirt Data.get_ID
IL_000D: callvirt DataRequest.set_ID
IL_0012: ret
public class DataRequest
{
public DataRequest()
{}
private int m_id;
public int ID
{
get { return m_id; }
set { m_id = value; }
}
}
public class Data
{
private int m_id;
public int ID
{
get { return m_id; }
set { m_id = value; }
}
}
class Program
{
static void Main()
{
var method = new DynamicMethod("DoSomething", typeof(void), new[] { typeof(Data) });
var methodIL = method.GetILGenerator();
var constructor = typeof(DataRequest).GetConstructor(new Type[0]);
var getMethodForData = typeof(Data).GetProperty("ID").GetGetMethod();
var setMethodForDataRequest = typeof(DataRequest).GetProperty("ID").GetSetMethod();
methodIL.Emit(OpCodes.Newobj, constructor);
// storing and loading the same object to the some local is useless
//var dataReuqest = methodIL.DeclareLocal(typeof(DataRequest));
//methodIL.Emit(OpCodes.Stloc, dataReuqest.LocalIndex);
//methodIL.Emit(OpCodes.Ldloc, dataReuqest.LocalIndex);
methodIL.Emit(OpCodes.Ldarg_0);
methodIL.Emit(OpCodes.Callvirt, getMethodForData);
methodIL.Emit(OpCodes.Callvirt, setMethodForDataRequest);
methodIL.Emit(OpCodes.Ret);
var f = (Action<Data>)method.CreateDelegate(typeof(Action<Data>));
var data = new Data { ID = 42 };
f(data);
}
}