Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menukar Fungsi .NET kepada Ungkapan?
Dalam .NET, ungkapan lambda boleh ditukar dengan mudah menjadi Expression<> menggunakan kelas Ekspresi. Walau bagaimanapun, mungkin terdapat keadaan di mana seseorang ingin menukar Func
Pertimbangkan kod berikut:
public void GimmeExpression(Expression<Func<T>> expression) { ((MemberExpression)expression.Body).Member.Name; // "DoStuff" } public void SomewhereElse() { GimmeExpression(() => thing.DoStuff()); }
Di sini, ungkapan lambda dihantar kepada kaedah GimmeExpression, yang mengekstrak nama kaedah dipanggil (DoStuff).
Sekarang, katakan kita ingin melakukan operasi yang serupa tetapi dalam konteks terhad:
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()); }
Dalam kes ini, kami cuba menukar Fungsi Panggilan berbahaya
Cannot implicitly convert type 'System.Func<T>' to 'System.Linq.Expressions.Expression<System.Func<T>>'. An explicit cast does not resolve the situation.
Ini kerana Func
Menyahhimpun bahasa perantaraan (IL) dan membuat kesimpulan ungkapan asal mungkin membenarkan penukaran ini jika data yang diperlukan belum dioptimumkan. Walau bagaimanapun, ini adalah pendekatan yang kompleks dan mungkin tidak boleh dipercayai.
Atas ialah kandungan terperinci Bagaimana untuk Menukar Fungsi .NET kepada Ungkapan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!