كيف يمكنني توسيع الفصل الدراسي باستخدام وسائل تمديد c#؟




extension-methods (6)

هل يمكن تطبيق طرق الإضافة على الفصل؟

على سبيل المثال ، قم بتوسيع DateTime لتضمين طريقة Tomorrow () التي يمكن استدعاؤها مثل:

DateTime.Tomorrow();

وأنا أعلم أنني يمكن استخدامها

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

أو

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

للحصول على نتيجة مماثلة ، ولكن كيف يمكنني تمديد DateTime حتى أتمكن من استدعاء DateTime.Tomorrow؟


استخدم طريقة ملحق .

مثلا:

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

الاستعمال:

DateTime.Now.Tomorrow();

أو

AnyObjectOfTypeDateTime.Tomorrow();

الأقرب يمكنني الحصول على الإجابة بإضافة أسلوب ملحق إلى كائن 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();
        }
    }
}

خلاف ذلك ، IMO Andrew و ShuggyCoUk لديه تطبيق أفضل.


طرق التمديد عبارة عن سكر نحوي لصنع طرق ثابتة تكون معلماتها الأولى مثالًا لنوع T تبدو كما لو كانت طريقة مثيل على T.

على هذا النحو تضيع الفائدة إلى حد كبير حيث يمكنك إنشاء "طرق تمديد ساكنة" لأنها قد تخلط بين قارئ الشفرة أكثر من طريقة تمديد (حيث أنها تبدو مؤهلة تمامًا ولكنها غير محددة فعليًا في هذه الفئة) من أجل عدم وجود مكاسب نحوية (القدرة على إجراء مكالمات متسلسلة في نمط بطلاقة داخل Linq على سبيل المثال).

نظرًا لأنك ستضطر إلى جعل الإضافات في نطاقها باستخدام على أي حال ، سأزعم أنه من الأسهل والأكثر أمانًا إنشاء:

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

ثم استخدم هذا في شفرتك عبر:

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

فهي توفر القدرة على توسيع الأنواع الحالية عن طريق إضافة طرق جديدة بدون أي تعديلات ضرورية للنوع. تُعرف أساليب الاتصال من كائنات من النوع الممتد داخل تطبيق باستخدام بناء جملة أسلوب مثيل بطرق '' extending ''. طرق الإضافة ليست أعضاء مثيل على النوع. النقطة الأساسية التي يجب تذكرها هي أن طرق الامتداد ، التي يتم تعريفها كطرق ثابتة ، تكون في النطاق فقط عندما يتم استيراد مساحة الاسم بشكل واضح إلى شفرة مصدر التطبيق الخاص بك عن طريق التوجيه باستخدام. على الرغم من أن طرق الامتداد يتم تعريفها كطرق ثابتة ، إلا أنها لا تزال تسمى باستخدام صيغة الجملة.

تحقق من المثال الكامل هنا http://www.dotnetreaders.com/articles/Extension_methods_in_C-sharp.net,Methods_in_C_-sharp/201

مثال:

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;
        }
    }

لا يمكنك إضافة أساليب إلى نوع موجود ما لم يتم وضع علامة على النوع الموجود جزئيًا ، يمكنك فقط إضافة أساليب تظهر كعضو في النوع الموجود من خلال طرق الإضافة. نظرًا لأن هذه هي الحالة ، لا يمكنك إضافة أساليب ثابتة إلى النوع نفسه نظرًا لأن أساليب الملحق تستخدم مثيلات من هذا النوع.

لا يوجد شيء يمنعك من إنشاء طريقة المساعدة الثابتة الخاصة بك مثل هذا:

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

الذي ستستخدمه على هذا النحو:

DateTime tomorrow = DateTimeHelper.Tomorrow;

لسوء الحظ ، لا يمكنك فعل ذلك. أعتقد أنه سيكون من المفيد ، على الرغم من. من الطبيعي أكثر أن تكتب:

DateTime.Tomorrow

من:

DateTimeUtil.Tomorrow

مع فئة Util ، يجب عليك التحقق من وجود أسلوب ثابت في فئتين مختلفتين ، بدلاً من واحدة.





extension-methods