Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menukar Fungsi .NET kepada Ungkapan?

Bagaimana untuk Menukar Fungsi .NET kepada Ungkapan?

Patricia Arquette
Patricia Arquetteasal
2025-01-05 16:20:40286semak imbas

How to Convert a .NET Func to an Expression?

Menukar Fungsi .NET kepada .NET Expression>

Dalam .NET, ungkapan lambda boleh ditukar dengan mudah menjadi Expression<> menggunakan kelas Ekspresi. Walau bagaimanapun, mungkin terdapat keadaan di mana seseorang ingin menukar Func kembali ke Ungkapan>.

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 ke dalam Ungkapan>, tetapi kami menghadapi ralat masa kompilasi:

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 mewakili perwakilan generik dan bukannya ungkapan. Walaupun pengkompil boleh menukar lambda kepada Expression<> objek, penukaran ini tidak mungkin untuk Func objek.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn