আমি সি # এক্সটেনশন পদ্ধতি সহ কোনও শ্রেণি কিভাবে প্রসারিত করব?


98

ক্লাসে কি এক্সটেনশন পদ্ধতি প্রয়োগ করা যেতে পারে?

উদাহরণস্বরূপ, আগামীকাল () পদ্ধতি অন্তর্ভুক্ত করতে ডেটটাইম প্রসারিত করুন যা এইভাবে আহ্বান করা যেতে পারে:

DateTime.Tomorrow();

আমি জানি আমি ব্যবহার করতে পারি

static DateTime Tomorrow(this Datetime value) { //... }

বা

public static MyClass {
  public static Tomorrow() { //... }
}

অনুরূপ ফলাফলের জন্য, তবে আমি কীভাবে তারিখটাইম বাড়িয়ে দিতে পারি যাতে আমি ডেটটাইমকে ডাকতে পারি? আগামীকাল?

উত্তর:


69

বিদ্যমান প্রকারটিকে আংশিক হিসাবে চিহ্নিত না করা ছাড়া আপনি কোনও বিদ্যমান ধরণের পদ্ধতিগুলিতে যুক্ত করতে পারবেন না, আপনি কেবল এক্সটেনশন পদ্ধতির মাধ্যমে বিদ্যমান পদ্ধতিতে সদস্য হিসাবে উপস্থিত উপস্থিত পদ্ধতিগুলি যুক্ত করতে পারেন । যেহেতু এটি ক্ষেত্রে তাই আপনি প্রকারের সাথে স্ট্যাটিক পদ্ধতিগুলি যুক্ত করতে পারবেন না কারণ এক্সটেনশন পদ্ধতিগুলি সেই ধরণের উদাহরণগুলি ব্যবহার করে।

আপনাকে নিজের স্ট্যাটিক সহায়ক পদ্ধতি তৈরি করতে বাধা দেওয়ার কিছুই নেই:

static class DateTimeHelper
{
    public static DateTime Tomorrow
    {
        get { return DateTime.Now.AddDays(1); }
    }
}

যা আপনি এটির মতো ব্যবহার করবেন:

DateTime tomorrow = DateTimeHelper.Tomorrow;

7
হু ওয়াট? এটি এবং 6 মাসের মধ্যে কুমুর উত্তরটি ঠিক এই মুহূর্তে প্রয়োগ করা না হলে এটিকে বাস্তবে অসম্পূর্ণ মনে হচ্ছে!
ক্রেগক্স

4
@ কাওস এটি অসম্পূর্ণ নয়, অ্যান্ড্রু দেখিয়েছেন কীভাবে এটি কোনও স্ট্যাটিক সহায়ক দিয়ে করা যায়, কোনও এক্সটেনশন পদ্ধতিতে নয় (যেহেতু কোনও উদাহরণ নেই)।
নিক এন।

4
ঠিক বলেছেন, নিক। আমি যদিও এক্সটেনশন পদ্ধতি পছন্দ করি না! ;)
ক্রেগক্স

4
এক্সটেনশনমেডোথ.এন.সিএসআরপি / তারিখের সময় সম্পর্কে কী ? আইএমএইচও, লার্নিং বক্ররেখা কমিয়ে আনার জন্য আরও ভাল নমুনাগুলি
হ'ল

4
এই কোডটি নিয়ে সমস্যাটি হ'ল এটি কেবল ডেটটাইম.এখন কাজ করে এবং কোনও ডেটটাইম অবজেক্ট নয়। ইউটিলিটি হিসাবে, কেউ আগের (বা ভবিষ্যত) দিনের পরের দিনটি নির্ধারণ করতে এটি ব্যবহার করতে চাইতে পারে।
ডেটটাইম

182

একটি এক্সটেনশন পদ্ধতি ব্যবহার করুন ।

প্রাক্তন:

namespace ExtensionMethods
{
    public static class MyExtensionMethods
    {
        public static DateTime Tomorrow(this DateTime date)
        {
            return date.AddDays(1);
        }    
    }
}

ব্যবহার:

DateTime.Now.Tomorrow();

বা

AnyObjectOfTypeDateTime.Tomorrow();

4
শুগির উত্তরও এটিকে সমাধান করার জন্য একই রকমভাবে কিছুটা আলোকপাত করেছে।
ক্রেগক্স

8
'এক্সটেনশনমেডস ব্যবহার করে' ভুলে যাবেন না; এটির জন্য আপনার নথির শীর্ষে।
লুক অলডারটন

আমি কেন ডেটটাইম করতে পারি না? আগামীকাল ()?
জুলফ

হাই লফফটগ, এই এক্সটেনশনের একটি অবজেক্ট দরকার, এখানে ডেটটাইম একটি স্ট্রাক্ট এবং কোনও অবজেক্ট নয়।
কুমু

4
পূর্ববর্তী মন্তব্যে উল্লিখিত হিসাবে (এটি আমার পক্ষে আপাতদৃষ্টিতে পরিষ্কার ছিল না), আপনি DateTime.Tomorrow()এক্সটেনশন পদ্ধতিগুলি কেবলমাত্র একটি শ্রেণি এবং শ্রেণি কাঠামোর ইনস্ট্যান্টে কাজ করেন তা ব্যবহার করতে পারবেন না । ক্লাস স্ট্রুকের স্থিতিশীল পদ্ধতিটি "প্রসারিত" করতে অ্যান্ড্রুয়ের উত্তর বা শুগির উত্তর অনুসরণ করুন ।
অ্যালেক্স

18

স্ট্যাটিক পদ্ধতিগুলি তৈরির জন্য এক্সটেনশন পদ্ধতিগুলি সিনট্যাক্টিক চিনি যাঁর প্রথম প্যারামিটারটি টাইপ টি চেহারা উদাহরণ হিসাবে দেখা যায় যে তারা টি-তে কোনও উদাহরণ পদ্ধতি were

এর ফলে সুবিধাগুলি মূলত হ্রাস পায় যেখানে আপনি 'স্ট্যাটিক এক্সটেনশন পদ্ধতি' তৈরি করতে পারেন কারণ তারা কোডের পাঠককে এমনকি কোনও এক্সটেনশন পদ্ধতির চেয়েও বিভ্রান্ত করে তোলে (যেহেতু তারা পুরোপুরি যোগ্য বলে মনে হয় তবে বাস্তবে সেই শ্রেণিতে সংজ্ঞায়িত হয় না) কোনও সিনট্যাক্টিক্যাল লাভের জন্য নয় (উদাহরণস্বরূপ লিনকের মধ্যে সাবলীল স্টাইলে কল চেইন করতে সক্ষম হওয়া)।

যেহেতু আপনাকে এক্সটেনশানগুলি কোনওভাবেই স্কোপে আনতে হবে আমি তর্ক করব এটি তৈরি করা সহজ এবং নিরাপদ:

public static class DateTimeUtils
{
    public static DateTime Tomorrow { get { ... } }
}

এবং তারপরে আপনার কোডে এটি ব্যবহার করুন:

WriteLine("{0}", DateTimeUtils.Tomorrow)

11

আমি উত্তর পেতে সবচেয়ে কাছাকাছি হ'ল একটি System.Typeবস্তুতে একটি এক্সটেনশন পদ্ধতি যুক্ত করে । সুন্দর নয়, তবে এখনও আকর্ষণীয়।

public static class Foo
{
    public static void Bar()
    {
        var now = DateTime.Now;
        var tomorrow = typeof(DateTime).Tomorrow();
    }

    public static DateTime Tomorrow(this System.Type type)
    {
        if (type == typeof(DateTime)) {
            return DateTime.Now.AddDays(1);
        } else {
            throw new InvalidOperationException();
        }
    }
}

অন্যথায়, আইএমও অ্যান্ড্রু এবং শুগিওউকের আরও কার্যকর বাস্তবায়ন রয়েছে।


এই পদ্ধতির সাথে সমস্যা রয়েছে। "টাইপফ (...)" টাইপ করা সুবিধাজনক নয় এবং ইন্টেলিজেন্সের সাহায্যে আপনি প্রতিটি ধরণের এক্সটেনশন দেখতে পাবেন। তবুও, এটি একটি আকর্ষণীয় পদ্ধতির যা আমি +1 ভাবিনি।
মেটা-নাইট

@ মেটা-নাইট সত্য, সে কারণেই আমি ব্যক্তিগতভাবে অন্যটির উত্তরকে পছন্দ করি। আমার উত্তরে ওপি প্রশ্নের নিকটতম বাক্য গঠন থাকবে তবে এই সমস্যাটি সমাধান করার সর্বোত্তম উপায় নয়।
অ্যাড্রিয়ান গডং 14

Typeপ্রয়োজনীয় অন্য যে কোনও ধরণের সাথে প্রতিস্থাপন করা যেতে পারে। আমি এটি দিয়ে ব্যবহার করি Fromএবং এটি পুরোপুরি কার্যকর হয়। সুতরাং আমি অনুমান করি যে এই উত্তরটি সাধারণ তবে সঠিক
কাটিয়া

3

আমি কুমুর মতোই করতাম

namespace ExtensionMethods
{
    public static class MyExtensionMethods
    {
        public static DateTime Tomorrow(this DateTime date)
        {
           return date.AddDays(1);
        }    
    }
}

তবে এটিকে এই নতুন ডেটটাইম () এর মতো বলুন T আগামীকাল ();

মনে করুন এটি ডেটটাইম.নু.কাল (কাল) এর চেয়ে বেশি সেন্স করে;


4
এবং আপনি কুমুর উত্তর সম্পর্কে মন্তব্য হিসাবে এটি লেখার একটি সুযোগ মিস করেছেন! : পি
ক্রেগক্স

3

তারা টাইপগুলির কোনও পরিবর্তন ছাড়াই নতুন পদ্ধতি যুক্ত করে বিদ্যমান প্রকারগুলি প্রসারিত করার ক্ষমতা সরবরাহ করে। উদাহরণস্বরূপ পদ্ধতি সিনট্যাক্স ব্যবহার করে কোনও অ্যাপ্লিকেশনের মধ্যে বর্ধিত ধরণের অবজেক্টগুলি থেকে কলিং পদ্ধতিগুলি '' প্রসারিত '' পদ্ধতি হিসাবে পরিচিত। এক্সটেনশন পদ্ধতিগুলি ধরণের উদাহরণস্বরূপ সদস্য নয়। মনে রাখার মূল বিষয়টি হ'ল স্থির পদ্ধতি হিসাবে সংজ্ঞায়িত এক্সটেনশন পদ্ধতিগুলি তখনই সুযোগের ফাঁকে থাকে যখন নাম স্থানটি স্পষ্টভাবে আপনার অ্যাপ্লিকেশন উত্স কোডটিতে ব্যবহারের নির্দেশের মাধ্যমে আমদানি করা হয়। যদিও এক্সটেনশন পদ্ধতিগুলি স্থির পদ্ধতি হিসাবে সংজ্ঞায়িত করা হয়, তবুও সেগুলিকে ইনস্ট্যান্স সিনট্যাক্স ব্যবহার করে ডাকা হয়।

এখানে সম্পূর্ণ উদাহরণটি দেখুন http://www.dotnetreaders.com/articles/Existance_methods_in_C-sharp.net, ম্যাথডস_ইন_সি_-শার্প

উদাহরণ:

class Extension
    {
        static void Main(string[] args)
        {
            string s = "sudhakar";
            Console.WriteLine(s.GetWordCount());
            Console.ReadLine();
        }

    }
    public static class MyMathExtension
    {

        public static int GetWordCount(this System.String mystring)
        {
            return mystring.Length;
        }
    }

3

আমি অনুরূপ কিছু সন্ধান করছিলাম - বর্ধনের পদ্ধতিগুলি সরবরাহ করে এমন ক্লাসগুলির প্রতিবন্ধকতার একটি তালিকা। একটি সংক্ষিপ্ত তালিকা খুঁজে পাওয়া শক্ত মনে হচ্ছে তাই এখানে যায়:

  1. আপনার কোনও ব্যক্তিগত বা সুরক্ষিত কোনও কিছুই থাকতে পারে না - ক্ষেত্র, পদ্ধতি ইত্যাদি

  2. এটা একটি স্ট্যাটিক বর্গ হতে হবে হিসাবে public static class...

  3. ক্লাসে কেবলমাত্র পদ্ধতি থাকতে পারে এবং সেগুলি অবশ্যই সর্বজনীন স্থির থাকতে হবে।

  4. আপনার প্রচলিত স্থিতিশীল পদ্ধতি থাকতে পারে না - যেগুলিতে এই যুক্তি অন্তর্ভুক্ত নয় তা অনুমোদিত নয়।

  5. সমস্ত পদ্ধতি শুরু করা আবশ্যক:

    পাবলিক স্ট্যাটিক রিটার্নটাইপ মেথডনম (এই ক্লাসনেম _ এটি, ...)

সুতরাং প্রথম যুক্তি সর্বদা এই রেফারেন্স হয়।

এটি তৈরি করে এমন একটি অন্তর্নিহিত সমস্যা রয়েছে - যদি আপনি এমন পদ্ধতিগুলি যুক্ত করেন যার জন্য যে কোনও ধরণের লক প্রয়োজন হয়, আপনি সত্যিই এটি শ্রেণীর স্তরে সরবরাহ করতে পারবেন না। সাধারণত আপনি একটি ব্যক্তিগত উদাহরণ স্তরের লক সরবরাহ করতে চান তবে কোনও ব্যক্তিগত ক্ষেত্র যুক্ত করা আপনার পক্ষে সম্ভব নয়, আপনাকে কিছু খুব বিশ্রী বিকল্প দিয়ে যেমন কিছু বাইরের শ্রেণিতে পাবলিক স্ট্যাটিক হিসাবে সরবরাহ করা ইত্যাদি etc. সি # ভাষার লক্ষণগুলির জন্য এগুলির জন্য নকশায় একটি খারাপ পরিবর্তন হয়েছিল

কর্মক্ষেত্রটি হ'ল আপনার এক্সটেনশন পদ্ধতি শ্রেণিটিকে একটি নিয়মিত শ্রেণীর মুখোমুখি হিসাবে ব্যবহার করা এবং আপনার এক্সটেনশন ক্লাসের সমস্ত স্থিতিশীল পদ্ধতিগুলি সম্ভবত একটি একক ব্যবহার করে আসল শ্রেণি কল করে ।


2

দুর্ভাগ্যক্রমে, আপনি এটি করতে পারবেন না। যদিও আমি বিশ্বাস করি এটি কার্যকর হবে। এটি টাইপ করা আরও প্রাকৃতিক:

DateTime.Tomorrow

এর চেয়ে:

DateTimeUtil.Tomorrow

ইউটিল ক্লাসের সাথে, আপনাকে একটি স্থিতির পরিবর্তে দুটি পৃথক শ্রেণিতে স্থির পদ্ধতির অস্তিত্ব পরীক্ষা করতে হবে।


2

আমরা বিশদ ব্যাখ্যার সাথে আমাদের উত্তরকে উন্নত করেছি extension এখন এক্সটেনশন পদ্ধতি সম্পর্কে এটি আরও সহজ

সম্প্রসারণ পদ্ধতি : এটি এমন একটি প্রক্রিয়া যার মাধ্যমে আমরা উপ শ্রেণি ব্যবহার না করে বা মূল শ্রেণি বা কাঠামোটি সংশোধন বা সংশোধন না করে বিদ্যমান শ্রেণীর আচরণ প্রসারিত করতে পারি।

আমরা আমাদের কাস্টম ক্লাস,। নেট ফ্রেমওয়ার্ক ক্লাস ইত্যাদি প্রসারিত করতে পারি

এক্সটেনশন পদ্ধতিটি আসলে একটি বিশেষ ধরণের স্ট্যাটিক পদ্ধতি যা স্থির শ্রেণিতে সংজ্ঞায়িত হয়।

হিসাবে DateTimeবর্গ ইতিমধ্যে উপরে নেওয়া হয় এবং অত: পর আমরা ব্যাখ্যা জন্য এই শ্রেণীর না নিয়েছি।

নীচে উদাহরণ দেওয়া আছে

// এটি একটি বিদ্যমান ক্যালকুলেটর শ্রেণি যেখানে কেবল একটি পদ্ধতি রয়েছে (যুক্ত)

public class Calculator 
{
    public double Add(double num1, double num2)
    {
        return num1 + num2;
    }

}

// Below is the extension class which have one extension method.  
public static class Extension
{
    // It is extension method and it's first parameter is a calculator class.It's behavior is going to extend. 
    public static double Division(this Calculator cal, double num1,double num2){
       return num1 / num2;
    }   
}

// We have tested the extension method below.        
class Program
{
    static void Main(string[] args)
    {
        Calculator cal = new Calculator();
        double add=cal.Add(10, 10);
        // It is a extension method in Calculator class.
        double add=cal.Division(100, 10)

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