2009-09-13 7 views
9

Ist es in C# möglich, Erweiterungsmethoden für eine Klasse zu erstellen, aber die Sichtbarkeit/Zugänglichkeit innerhalb einer Klasse einzuschränken? (ZB Erweiterungsmethode A auf Klasse M nur zugänglich in Klasse Z)C# -Erweiterungsmethoden nur innerhalb einer Klasse sichtbar ("privat")

Beispiel:

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

In obigem Beispiel möchte ich die Erweiterungsmethode „MakeMillionaire“ Verlängerung der String-Klasse nur sichtbar zu sein, und zugänglich innerhalb der Klasse A. Kann ich das irgendwie tun, indem ich die Erweiterungsmethode in einer statischen Klasse innerhalb der Klasse A definiere?

Bearbeiten: Wenn Sie eine reguläre geschachtelte Klasse versuchen, ergibt sich "Fehler: Erweiterungsmethoden müssen in einer statischen Klasse auf oberster Ebene definiert werden".

+0

Wenn Sie dies versuchen, was passiert? –

+0

Ich bekomme "Fehler: Erweiterungsmethoden müssen in einer Top-Level-Klasse definiert werden" .... – Alex

Antwort

15

Erweiterungsmethoden können nur in einer statischen, nicht generischen äußeren (nicht verschachtelten) Klasse definiert werden.

Normalerweise mache ich in solchen Szenarien eine separate statische interne Klasse in einem anderen Namespace in derselben Datei und schließe dann den Namespace nur in dieser Datei ein.

Es wäre immer noch für andere Klassen in dieser Baugruppe sichtbar; Die einzige Möglichkeit, dies zu vermeiden, ist, die verbrauchende Klasse (class A in Ihrem Beispiel) in eine eigene Assembly zu verschieben, was Sie wahrscheinlich nicht tun möchten.

9

Deklarieren Sie die Erweiterungsmethoden in einem separaten Namespace, und Sie können diesen Namespace in bestimmte Dateien einschließen, die Sie verwenden möchten. Deklarieren Sie anschließend ClassA (die Klasse, in der Sie die Erweiterungsmethoden verwenden möchten) in einer separaten Datei und verwenden Sie diesen Namespace ganz oben in ClassA.cs. Auf diese Weise hat nur diese Klasse Zugriff auf diese Erweiterungsmethoden.

Edit:

So etwas wie die folgenden

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. 
} 
Verwandte Themen