我現在移植使用表達式.Net Core
應用程序的一些庫,遇到了我所有的邏輯是基於LambdaExpression.CompileToMethod
這簡直是在缺少一個問題,下面是示例代碼:替代
public static MethodInfo CompileToInstanceMethod(this LambdaExpression expression, TypeBuilder tb, string methodName, MethodAttributes attributes)
{
...
var method = tb.DefineMethod($"<{proxy.Name}>__StaticProxy", MethodAttributes.Private | MethodAttributes.Static, proxy.ReturnType, paramTypes);
expression.CompileToMethod(method);
...
}
是否有可能以某種方式重寫它,以便使用表達式生成方法成爲可能?我已經可以用Emit
做到這一點,但它非常複雜,我想避免它用於高級表達式。
我試圖用var method = expression.Compile().GetMethodInfo();
但在這種情況下,我得到一個錯誤:
System.InvalidOperationException : Unable to import a global method or field from a different module.
我知道我可以手動發出IL,但我需要準確地轉換Expression
- >到MethodInfo
綁定到特定TypeBuilder
代替建立我自己DynamicMethod
就可以了。
哇,試圖回答這個問題,我剛剛發現,.net核心缺乏文檔,沒有簡單的方法來找出什麼被取代什麼...運氣好的端口... –
@LucasCorsaletti我認爲提供這樣的文檔是非常困難的,因爲我猜即使.net核心團隊也不知道什麼被替換了:)無論如何,謝謝你的嘗試 –
有趣的是,我正在看這個問題。剛剛嘗試使用Linq.Expressions和最近的舊.NET 4.5創建類/實例方法。動態方法可以創建爲實例方法,與可見性屬性相關,但需要Reflection.Emit。使用Linq.Expressions構建它更具可讀性,但它不能用作實例方法。然而,我可以無恥地訪問內部和私有,使得與實例方法相同的功能成爲可能。我只是一個運行時代碼生成的初學者... –