অ্যাকশন () থেকে কীভাবে মূল্য ফেরত পাবেন?


95

এই প্রশ্নের উত্তরের ক্ষেত্রে ডেটা কনটেক্সটকে অ্যাকশন () এ পাস করার জন্য , আমি কীভাবে ক্রিয়া (ডিবি) থেকে কোনও মান ফিরিয়ে দেব?

SimpleUsing.DoUsing(db => { 
// do whatever with db 
}); 

আরও ভালো হওয়া উচিত:

MyType myType = SimpleUsing.DoUsing<MyType>(db => { 
// do whatever with db.  query buit using db returns MyType.
}); 

উত্তর:


100

আপনার স্থিতিশীল পদ্ধতিটি এখান থেকে যেতে হবে:

public static class SimpleUsing
{
    public static void DoUsing(Action<MyDataContext> action)
    {
        using (MyDataContext db = new MyDataContext())
           action(db);
    }
}

প্রতি:

public static class SimpleUsing
{
    public static TResult DoUsing<TResult>(Func<MyDataContext, TResult> action)
    {
        using (MyDataContext db = new MyDataContext())
           return action(db);
    }
}

এই উত্তরটি মন্তব্যে ছড়িয়ে পড়েছে যাতে আমি কোড সরবরাহ করতে পারি। সম্পূর্ণ বিবরণের জন্য, দয়া করে নীচে @ sll এর উত্তর দেখুন।


114

আপনি Func<T, TResult>জেনেরিক প্রতিনিধি ব্যবহার করতে পারেন । ( এমএসডিএন দেখুন )

Func<MyType, ReturnType> func = (db) => { return new MyType(); }

এছাড়াও দরকারী জেনেরিক প্রতিনিধিরা রয়েছে যা প্রত্যাবর্তনের মান বিবেচনা করে:


পদ্ধতি:

public MyType SimpleUsing.DoUsing<MyType>(Func<TInput, MyType> myTypeFactory)

জেনেরিক প্রতিনিধি:

Func<InputArgumentType, MyType> createInstance = db => return new MyType();

এক্সিকিউট:

MyType myTypeInstance = SimpleUsing.DoUsing(
                            createInstance(new InputArgumentType()));

বা স্পষ্টত:

MyType myTypeInstance = SimpleUsing.DoUsing(db => return new MyType());

6
@ এলবি - লোককে গুগলে জিজ্ঞাসা করা গঠনমূলক নয়। সম্পূর্ণ উত্তর প্রদানের জন্য এসও বিদ্যমান।
কার্ক ওল

4
@ কির্কওয়ল তবে উত্তরটি উপাদানগুলি দেয় , এটি রান্না
এলবি

9
@ এলবি - এটি সম্পূর্ণ হওয়ার পক্ষে এটি আরও ভাল। আমি আপনার উপমাটি উত্সাহী বলে মনে করি।
কर्क ওল

4
@ এলবি, মন্তব্য না করাই ভাল যেহেতু আপনি এখন পর্যন্ত কোনও মূল্য যোগ করছেন না।
চতুর্থ স্পেস

4
@ শান_আন্ড্রয়েড_দেভ - আপনি ঠিক বলেছেন তবে অ্যাকশন কোনও মূল্য ফেরত দেওয়ার কোনও সুবিধা নয়, অবশ্যই আমরা ঘুরে দাঁড়াতে পারি এবং চাকাটি পুনরুদ্ধার করতে পারি তবে এ জাতীয় কোড জটিলতায় মূলত অ্যাকশনে লেগে থাকা কি কার্যকর?
sll

15

আপনি যে ল্যাম্বদা বা বেনামেটি পদ্ধতিতে তার ঘেরের সুযোগগুলিতে ভেরিয়েবলগুলি বন্ধ করতে পারে তারও সুবিধা নিতে পারেন।

MyType result;

SimpleUsing.DoUsing(db => 
{
  result = db.SomeQuery(); //whatever returns the MyType result
}); 

//do something with result

হ্যাঁ, এটিকে ক্লোজার বলা হয় (ফ্যানসিটোনাল ল্যাঙ্গুয়েজ স্টাফ যা আমাদের জন্যও উপলভ্য)
sll করুন

4

Func<T>বরং ব্যবহার করুন Action<T>

Action<T>টি টাইপ প্যারামিটারের সাথে একটি অকার্যকর পদ্ধতির Func<T>মতো কাজ করে , যখন কোনও পরামিতিবিহীন কোনও ফাংশনের মতো কাজ করে এবং যা টাইপ টি এর কোনও বস্তু ফেরত দেয়

আপনি যদি আপনার ফাংশনটিতে প্যারামিটার দিতে চান তবে ব্যবহার করুন Func<TParameter1, TParameter2, ..., TReturn>

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