.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);
    }
}