void DoSomething(Data data){
var myDataRequest = new DataRequest();
myDataRequest.ID = data.ID
}
我有以下什麼是Reflection.Emit的IL代碼如下的equivilent
methodIL.Emit(OpCodes.Ldloc_1);
methodIL.Emit(OpCodes.Ldarg_0);
methodIL.Emit(OpCodes.Callvirt, getMethodForData);
methodIL.Emit(OpCodes.Callvirt, setMethodForDataRequest);
methodIL.Emit(OpCodes.Nop);
但它似乎沒有工作
代碼,我真的要產生:
static Response TestRequestResponse(RequestData requestData) {
var wrapper = new WrapperResponse<Response>();
var request = new Request() { };
request.RequestID = requestData.RequestID;
request.Value = requestData.Value;
request.ID = requestData.ID;
request.OnReply(wrapper.Handle);
request.WaitForResponse(true);
request.TimeOut(TimeSpan.FromSeconds(30));
request.Send();
return wrapper.Response;
}
有一個名爲CreateProxy()的方法,它假設生成上面的代碼。但是零件循環並生成方法的get和set不能正常工作。它從來沒有請求對象的值,它總是保留爲空
我解決了這個問題,我使用OpCodes.Ldarg_0到OpCodes.Ldarg_1
改變methodIL.Emit(OpCodes.Ldloc_1);
methodIL.Emit(OpCodes.Ldarg_1);
methodIL.Emit(OpCodes.Callvirt, getMethodForData);
methodIL.Emit(OpCodes.Callvirt, setMethodForDataRequest);
methodIL.Emit(OpCodes.Nop);
如果您使用.net 4,那麼您可以編譯基於表達式樹的方法,這很容易創建。 –
我使用reflection.emit的原因是因爲我正在根據接口方法生成一個類。表達式樹不適合這種情況。 – rpgmaker
我認爲你可以將表達式樹編譯到現有的方法構建器中。這可能會讓你實現一個接口。 – CodesInChaos