Meneruskan fungsi panggilan balik ke kelas lain


91

Saya pada dasarnya mencoba untuk meneruskan metode ke kelas lain untuk dipanggil nanti, tetapi tidak cukup memahami ini di C # (Saya masih terlalu terbiasa dengan Objective-C).

public class Class1{

    private void btn_click(object sender, EventArgs e)
    {
        ServerRequest sr = new ServerRequest();
        sr.DoRequest("myrequest", myCallback);
    }

    public void myCallback(string str)
    {
    }
}

Kemudian nanti saya ingin kelas ServerRequest saya pada dasarnya mengaktifkan fungsi panggilan balik, apakah ini tidak mungkin? (Saya pada dasarnya menelepon ke rumah ke server untuk tanggapan masuk ke perangkat lunak saya)

Saya belum dapat menemukan cara untuk melakukan ini dengan delegasi, terus menerus mendapatkan kesalahan. Ini kelas lainnya:

public class ServerRequest
{
    public void DoRequest(string request, Delegate callback)
    {
        // do stuff....
        callback("asdf");
    }
}

Apakah ini mungkin di #? Di Objective-C ini akan sederhana dan saya hanya akan melakukan sesuatu seperti

[myObject performSelector(@selector(MyFunctionName)) withObjects:nil];

Jawaban:


140

Anda dapat mengirimkannya sebagai Action<string>- yang artinya ini adalah metode dengan satu parameter tipe stringyang tidak mengembalikan apa pun (void):

public void DoRequest(string request, Action<string> callback)
{
    // do stuff....
    callback("asdf");
}

Dan bagaimana Anda memanggil DoRequest? Apakah Anda mengoper string atau metode?
Kokodoko

1
bagi yang penasaran lainnya tentang Action. ini tip singkat. itu dapat memiliki beberapa tipe parms tetapi tidak ada pengembalian (untuk meneruskan c # hanya anggota Tindakan <type1, .., typeN> tidak mengizinkan pengubah pada tipe Untuk meneruskan fungsi, gunakan Func <typeList> lagi tidak ada pengubah pada tipe apa pun tipe terakhir di list adalah jenis fungsi yang dikembalikan sebenarnya Action dan Func adalah cara cepat untuk menggunakan delegasi sederhana
gg89

Jadikan hari saya sederhana dan bersih!
isanjosgon

24
public class Class1
    {

        private void btn_click(object sender, EventArgs e)
        {
            ServerRequest sr = new ServerRequest();
            sr.Callback += new ServerRequest.CallbackEventHandler(sr_Callback);
            sr.DoRequest("myrequest");
        }

        void sr_Callback(string something)
        {

        }


    }

    public class ServerRequest
    {
        public delegate void CallbackEventHandler(string something);
        public event CallbackEventHandler Callback;   

        public void DoRequest(string request)
        {
            // do stuff....
            if (Callback != null)
                Callback("bla");
        }
    }

10

Anda harus mendeklarasikan jenis delegasi terlebih dahulu karena tipe delegasi sangat diketik:

public void MyCallbackDelegate( string str );

public void DoRequest(string request, MyCallbackDelegate callback)
{
     // do stuff....
     callback("asdf");
}

Ini adalah solusi yang bagus jika Anda menggunakan tanda tangan metode yang sama di banyak tempat dalam kode Anda.
mtmurdock

4
Merupakan praktik yang baik untuk selalu memeriksa apakah metode callback tidak null sebelum memanggilnya.
Maciej

4

Delegatehanyalah kelas dasar jadi Anda tidak bisa menggunakannya seperti itu. Anda bisa melakukan sesuatu seperti ini:

public void DoRequest(string request, Action<string> callback)
{
     // do stuff....
     callback("asdf");
}

2
Func<string>akan menjadi metode yang mengembalikan string - Anda memerlukanAction<string>
BrokenGlass

@BrokenGlass Anda benar saya buruk - diperbarui (saya memberi +1 pada jawaban Anda)
Robbie

4

Anda dapat mengubah kode Anda dengan cara ini:

public delegate void CallbackHandler(string str);

public class ServerRequest
{
    public void DoRequest(string request, CallbackHandler callback)
    {
        // do stuff....
        callback("asdf");
    }
}

2

Yang Anda butuhkan adalah delegasi dan panggilan balik. Berikut adalah artikel MSDN yang bagus yang akan menunjukkan kepada Anda bagaimana menggunakan teknik ini di C #.


2

Anda hanya dapat menggunakan delegasi yang terbaik untuk fungsi callback:

public class ServerRequest
{
    public delegate void CallBackFunction(string input);

    public void DoRequest(string request, CallBackFunction callback)
    {
        // do stuff....
        callback(request);
    }
}

dan konsumsilah seperti di bawah ini:

public class Class1
    {
        private void btn_click(object sender, EventArgs e)
        {
            ServerRequest sr = new ServerRequest();
            var callback = new ServerRequest.CallBackFunction(CallbackFunc);
            sr.DoRequest("myrequest",callback);
        }

        void CallbackFunc(string something)
        {

        }


    }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.