কলব্যাক ফাংশন অন্য ক্লাসে পাস করা


91

আমি প্রথমে অন্য ক্লাসে পরে যাওয়ার জন্য একটি পদ্ধতি পাস করার চেষ্টা করছি, তবে এটি সি # তে পুরোপুরি বুঝতে পারছি না (আমি এখনও অবজেক্টিভ-সি তে খুব অভ্যস্ত) না।

public class Class1{

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

    public void myCallback(string str)
    {
    }
}

তারপরে পরে আমি চাই যে আমার সার্ভারআরকিউস্ট ক্লাসটি মূলত কলব্যাক ফাংশনটি ফায়ার করবে, এটি কি সম্ভব নয়? (আমি মূলত আমার সফ্টওয়্যারটিতে লগইন সাড়া দেওয়ার জন্য একটি সার্ভারে বাড়িতে ফোন করছি)

প্রতিনিধিদের সাথে এটি করার কোনও উপায় আমি খুঁজে পাচ্ছি না, ক্রমাগত ত্রুটি পেতে পারি। এখানে অন্য শ্রেণি:

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

# এ কি সম্ভব? উদ্দেশ্য-সিতে এটি সহজ হবে এবং আমি ঠিক এর মতো কিছু করব

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

উত্তর:


140

আপনি এটি হিসাবে পাস করতে পারেন Action<string>- যার অর্থ এটি এমন একক প্যারামিটার সহ এমন একটি পদ্ধতি stringযা কোনও কিছুই শূন্য করে না (অকার্যকর):

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

এবং আপনি কীভাবে ডরকেউয়েস্টকে কল করবেন? আপনি একটি স্ট্রিং বা একটি পদ্ধতি পাস?
— কোকোডোকো

4
অ্যাকশন সম্পর্কে অন্যান্য কৌতূহলের জন্য। এখানে একটি দ্রুত পরামর্শ। এটিতে একাধিক প্রকারের পারম থাকতে পারে তবে কোনও রিটার্ন পাওয়া যাবে না (কেবল সি # সদস্যের জন্য অ্যাকশন <টাইপ 1, .., টাইপএন> টাইপগুলিতে সংশোধককে অনুমতি দেয় না ফাংশনটি পাস করতে, ফানক <টাইপলিস্ট> আবার কোনও ধরনের কোনও সংশোধক ব্যবহার করতে পারেন তালিকার ফাংশন রিটার্ন টাইপ আসলে অ্যাকশন এবং
— ফানক

আমার দিনটি সহজ এবং পরিষ্কার করুন!
— আইসানজোগন

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

আপনাকে প্রথমে ডেলিগেটের ধরণটি ঘোষণা করতে হবে কারণ প্রতিনিধিরা দৃ strongly়ভাবে টাইপ করেছেন:

public void MyCallbackDelegate( string str );

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

আপনি যদি আপনার কোডের অনেক জায়গায় একই পদ্ধতি স্বাক্ষর ব্যবহার করে থাকেন তবে এটি দুর্দান্ত সমাধান।
— এমটিমুরডক

4
কলব্যাক করার পদ্ধতিটি কল করার আগে তা বাতিল নয় কিনা তা সর্বদা পরীক্ষা করা ভাল অভ্যাস।
— ম্যাকিয়েজ

4

Delegateএটি কেবল বেস ক্লাস যাতে আপনি এটি এর মতো ব্যবহার করতে পারবেন না। আপনি যদিও এর মতো কিছু করতে পারেন:

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

4
Func<string>একটি পদ্ধতি যে হবে ফেরৎ একটি স্ট্রিং - আপনি একটি প্রয়োজনAction<string>
— BrokenGlass

@ ব্রোকেনগ্লাস আপনি আমার খারাপটি ঠিক বলেছেন - আপডেট হয়েছে (আমি আপনার উত্তর +1 করেছি)
— রবি

4

আপনি এইভাবে আপনার কোড পরিবর্তন করতে পারেন:

public delegate void CallbackHandler(string str);

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

2

আপনার যা প্রয়োজন তা হ'ল একটি প্রতিনিধি এবং একটি কলব্যাক। এখানে একটি দুর্দান্ত এমএসডিএন নিবন্ধ রয়েছে যা আপনাকে সি # তে এই কৌশলটি কীভাবে ব্যবহার করতে হবে তা দেখিয়ে দেবে।


2

আপনি কেবল ডেলিগেট ব্যবহার করতে পারেন যা কলব্যাক ফাংশনের জন্য সবচেয়ে ভাল:

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

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

এবং নীচের মত এটি গ্রহণ:

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)
        {

        }


    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.