Metodi di estensione C # visibili e accessibili solo all'interno di una classe ("privato")

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

  •  06-07-2019
  •  | 
  •  

Domanda

È possibile, in C #, creare metodi di estensione su una classe ma limitare la visibilità / accessibilità all'interno di una classe? (ad es. il metodo di estensione A sulla classe M è accessibile solo all'interno della classe Z)

Esempio:

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

Nell'esempio sopra voglio il metodo di estensione "MakeMillionaire" estendere la classe String solo in modo che sia visibile e accessibile all'interno della classe A. Posso farlo in qualche modo definendo il metodo di estensione in una classe statica all'interno della classe A?

Modifica: provare una normale classe nidificata produce " Errore: i metodi di estensione devono essere definiti in una classe statica di alto livello " ;.

È stato utile?

Soluzione

I metodi di estensione possono essere definiti solo in una classe esterna non generica statica (non nidificata).

Quello che faccio di solito in tali scenari è creare una classe interna statica separata in uno spazio dei nomi diverso nello stesso file, quindi includere quello spazio dei nomi solo in quel file.

Sarebbe comunque visibile ad altre classi in quell'assemblea; l'unico modo per evitarlo è spostare la classe consumatrice ( classe A nel tuo esempio) nel proprio assembly, cosa che probabilmente non vuoi fare.

Altri suggerimenti

Dichiara i tuoi metodi di estensione in uno spazio dei nomi separato e puoi includere quello spazio dei nomi in file specifici che desideri utilizzarli. Quindi, dichiarare ClassA (la classe in cui si desidera utilizzare i metodi di estensione) in un file separato e utilizzare quello spazio dei nomi nella parte superiore di ClassA.cs. In questo modo, solo quella classe avrà accesso a questi metodi di estensione.

Modifica

Qualcosa di simile al seguente

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.
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top