在.NET 中,lambda 表達式可以輕鬆轉換為表達式。使用表達式類別。然而,可能存在希望將Func
考慮以下程式碼:
public void GimmeExpression(Expression<Func<T>> expression) { ((MemberExpression)expression.Body).Member.Name; // "DoStuff" } public void SomewhereElse() { GimmeExpression(() => thing.DoStuff()); }
這裡,將 lambda 表達式傳遞給 GimmeExpression 方法,該方法提取表達式的名稱被呼叫的方法 (DoStuff)。
現在,假設我們想要執行類似的操作,但在受限的環境中context:
public void ContainTheDanger(Func<T> dangerousCall) { try { dangerousCall(); } catch (Exception e) { // This next line does not work... Expression<Func<T>> DangerousExpression = dangerousCall; var nameOfDanger = ((MemberExpression)dangerousCall.Body).Member.Name; throw new DangerContainer( "Danger manifested while " + nameOfDanger, e); } } public void SomewhereElse() { ContainTheDanger(() => thing.CrossTheStreams()); }
在這種情況下,我們嘗試將危險調用函數
Cannot implicitly convert type 'System.Func<T>' to 'System.Linq.Expressions.Expression<System.Func<T>>'. An explicit cast does not resolve the situation.
這是因為Func
如果必要的資料尚未被最佳化掉,則反彙編中間語言(IL)並推斷原始表達式可能允許這種轉換。然而,這是一種複雜且可能不可靠的方法。
以上是如何將 .NET 函數轉換為表達式?的詳細內容。更多資訊請關注PHP中文網其他相關文章!