2009-09-13 7 views
9

Est-il possible, en C#, de créer des méthodes d'extension sur une classe mais de restreindre la visibilité/accessibilité au sein d'une classe? (Par exemple Extension Méthode A de classe M est accessible uniquement au sein de la classe Z)Méthodes d'extension C# uniquement visibles et accessibles dans une classe ("private")

Exemple:

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

Dans l'exemple ci-dessus, je veux la méthode d'extension « MakeMillionaire » extension de la classe de chaînes seulement à être visible et accessible en classe A. Puis-je le faire en définissant la méthode d'extension dans une classe statique dans la classe A? Editer: Essayer une classe imbriquée régulière donne "Erreur: Les méthodes d'extension doivent être définies dans une classe statique de premier niveau".

+0

Lorsque vous essayez de faire cela, que se passe-t-il? –

+0

Je reçois "Erreur: les méthodes d'extension doivent être définies dans une classe statique de premier niveau" .... – Alex

Répondre

15

Les méthodes d'extension ne peuvent être définies que dans une classe externe non générique statique (non imbriquée).

Ce que je fais habituellement dans de tels scénarios est de créer une classe interne statique distincte dans un espace de noms différent dans le même fichier, puis d'inclure cet espace de noms uniquement dans ce fichier.

Il serait toujours visible pour les autres classes de cet assembly; la seule façon d'éviter cela est de déplacer la classe consommatrice (class A dans votre exemple) vers son propre assembly, ce que vous ne voulez probablement pas faire.

9

Déclarez vos méthodes d'extension dans un espace de noms distinct, et vous pouvez inclure cet espace de noms dans des fichiers spécifiques que vous souhaitez utiliser. Ensuite, déclarez ClassA (la classe dans laquelle vous souhaitez utiliser vos méthodes d'extension) dans un fichier distinct et utilisez cet espace de noms en haut de ClassA.cs. De cette façon, seule cette classe aura accès à ces méthodes d'extension.

Edit:

Quelque chose comme le

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 suivant:

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. 
} 
Questions connexes