Легко, скомпилируйте свой метод и используйте некоторый декомпилятор (Reflector или даже LINQPad) для чтения IL.Я получил следующий IL:
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);
}
}
Может быть, вы забыли объявить локальные переменные выиспользуя