C# طرق التمديد مرئية فقط ويمكن الوصول إليها داخل فئة واحدة ("خاصة")

StackOverflow https://stackoverflow.com/questions/1416702

  •  06-07-2019
  •  | 
  •  

سؤال

هل من الممكن ، في C#، إنشاء أساليب تمديد على الفصل ولكن تقيد الرؤية/إمكانية الوصول داخل الفصل؟ (على سبيل المثال ، يمكن الوصول إلى طريقة التمديد A على الفئة M فقط داخل الفئة Z)

مثال:

class A
{
     String foo = "";
     String bar = foo.MakeMillionaire("arg");
}

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

تحرير: تجربة فئة متداخلة منتظمة "خطأ: يجب تحديد طرق التمديد في فئة ثابتة من المستوى الأعلى".

هل كانت مفيدة؟

المحلول

لا يمكن تعريف طرق التمديد إلا في فئة خارجي غير متكافئ (غير متداخل) ثابتة.

ما أقوم به عادة في مثل هذه السيناريوهات هو جعل فئة داخلية ثابتة منفصلة في مساحة اسم مختلفة في نفس الملف ، ثم قم بتضمين مساحة الاسم فقط في هذا الملف.

سيظل مرئيًا لفصول أخرى في تلك التجميع ؛ الطريقة الوحيدة لتجنب ذلك هي نقل الفئة المستهلكة (class A في مثالك) إلى التجميع الخاص به ، والتي ربما لا تريد القيام بها.

نصائح أخرى

أعلن أساليب التمديد في مساحة اسم منفصلة ، ويمكنك تضمين مساحة الاسم في ملفات محددة تريد استخدامها. بعد ذلك ، أعلن Classa (الفئة التي تريد استخدامها أساليب التمديد الخاصة بك) في ملف منفصل ، واستخدم مساحة الاسم في الجزء العلوي من classa.cs. وبهذه الطريقة ، فقط هذه الفئة هي التي يمكنها الوصول إلى طرق التمديد هذه.

يحرر:

شيء مثل ما يلي

namespace Extension {
    public static class ExtensionMethods {
        public static string EnumValue(this MyEnum e) {
            switch (e) {
                case MyEnum.First:
                    return "First Friendly Value";
                case MyEnum.Second:
                    return "Second Friendly Value";
                case MyEnum.Third:
                    return "Third Friendly Value";
            }
            return "Horrible Failure!!";
        }
    }
}

classa.cs:

using Extension;

public class ClassA{
    //Work your magic here, using the EnumValue Extension method
    //wherever you want
}

classb.cs

public class ClassB{
    //EnumValue is not a valid Extension Method here.
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top