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




(9)

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

مثلا:

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

الاستعمال:

DateTime.Now.Tomorrow();

أو

AnyObjectOfTypeDateTime.Tomorrow();

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

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

DateTime.Tomorrow();

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

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

أو

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

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


لقد قمنا بتحسين إجابتنا مع شرح التفاصيل. الآن من السهل فهم طريقة التمديد

طريقة التمديد : هي آلية يمكننا من خلالها توسيع سلوك الطبقة الموجودة دون استخدام التصنيف الفرعي أو تعديل أو إعادة تصنيف الطبقة أو البنية الأصلية.

يمكننا توسيع فصولنا المخصصة ، ودروس إطار .net الخ

طريقة الإضافة هي في الواقع نوع خاص من طريقة ثابتة يتم تعريفها في الفئة الثابتة.

نظرًا لأن فئة 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)

    }
}

فهي توفر القدرة على توسيع الأنواع الحالية عن طريق إضافة طرق جديدة بدون أي تعديلات ضرورية للنوع. تُعرف أساليب الاتصال من كائنات من النوع الممتد داخل تطبيق باستخدام بناء جملة أسلوب مثيل بطرق '' 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;
        }
    }

سأفعل نفس الشيء مثل كومو

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

ولكن نسميها مثل هذا DateTime الجديد ().

أعتقد أنه يجعل أكثر seens من DateTime.Now.Tomorrow ()؛


كنت أبحث عن شيء مماثل - قائمة من القيود على الطبقات التي توفر طرق الإرشاد. يبدو من الصعب العثور على قائمة موجزة حتى يذهب هنا:

  1. لا يمكنك الحصول على أي شيء خاص أو محمي - الحقول ، الأساليب ، إلخ.

  2. يجب أن يكون طبقة ثابتة ، كما هو الحال في public static class...

  3. يمكن أن تكون الطرق فقط في الفصل ، ويجب أن تكون كلها عامة ثابتة.

  4. لا يمكنك استخدام أساليب ثابتة تقليدية - لا يُسمح باستخدام تلك التي لا تتضمن هذه الحجة.

  5. يجب أن تبدأ جميع الطرق:

    public static ReturnType MethodName (this ClassName _this، ...)

لذا فإن الوسيطة الأولى هي دائما هذا المرجع.

هناك مشكلة ضمنية تنشأ عن ذلك - إذا قمت بإضافة طرق تتطلب قفلًا من أي نوع ، فلا يمكنك توفيره بالفعل على مستوى الفصل. عادةً ما تقدم تأمينًا خاصًا على مستوى المثيل ، ولكن لا يمكن إضافة أي حقول خاصة ، مما يترك لك بعض الخيارات المحرجة جدًا ، مثل توفيرها كقوة عامة في بعض الصفوف الخارجية ، إلخ. علامات لغة C # كان لها نوع من التحول السيئ في التصميم لهذه .

الحل هو استخدام فئة "أسلوب ملحق" الخاص بك كواجهة فقط إلى فئة عادية ، وكافة الأساليب الثابتة في فئة ملحق فقط استدعاء فئة حقيقية ، ربما باستخدام سينجلتون .


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

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

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

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

DateTime tomorrow = DateTimeHelper.Tomorrow;

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

DateTime.Tomorrow

من:

DateTimeUtil.Tomorrow

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


الأقرب يمكنني الحصول على الإجابة بإضافة أسلوب ملحق إلى كائن 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 لديه تطبيق أفضل.


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

var result = EnumParser<MyEnum>.Parse(valueToParse, MyEnum.FirstValue);

هنا الرمز:

using System;

public class EnumParser<T> where T : struct
{
    public static T Parse(int toParse, T defaultVal)
    {
        return Parse(toParse + "", defaultVal);
    }
    public static T Parse(string toParse, T defaultVal) 
    {
        T enumVal = defaultVal;
        if (defaultVal is Enum && !String.IsNullOrEmpty(toParse))
        {
            int index;
            if (int.TryParse(toParse, out index))
            {
                Enum.TryParse(index + "", out enumVal);
            }
            else
            {
                if (!Enum.TryParse<T>(toParse + "", true, out enumVal))
                {
                    MatchPartialName(toParse, ref enumVal);
                }
            }
        }
        return enumVal;
    }

    public static void MatchPartialName(string toParse, ref T enumVal)
    {
        foreach (string member in enumVal.GetType().GetEnumNames())
        {
            if (member.ToLower().Contains(toParse.ToLower()))
            {
                if (Enum.TryParse<T>(member + "", out enumVal))
                {
                    break;
                }
            }
        }
    }
}

لمعلوماتك: كان السؤال عن الأعداد الصحيحة ، والتي لم يذكرها أحد سيتم أيضا تحويل صريح في Enum.TryParse ()







c# extension-methods