Metodi di estensione C # visibili e accessibili solo all'interno di una classe ("privato")
-
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 " ;.
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.
}