2009-09-13 26 views
9

¿Es posible, en C#, crear métodos de extensión en una clase pero restringir la visibilidad/accesibilidad dentro de una clase? (Por ejemplo, Método de extensión A de la clase M sólo es accesible dentro de la clase Z)C# Métodos de extensión solo visibles y accesibles dentro de una clase ("privada")

Ejemplo:

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

En ejemplo anterior Quiero el método de extensión "MakeMillionaire" que se extiende la clase String solamente a ser visible y accesible dentro de la clase A. ¿Puedo hacer esto de alguna manera al definir el método de extensión en una clase estática dentro de la clase A?

Editar: Probar una clase anidada normal produce "Error: los métodos de extensión se deben definir en una clase estática de nivel superior".

+0

Cuando intentas hacer esto, ¿qué sucede? –

+0

Aparece "Error: los métodos de extensión se deben definir en una clase estática de nivel superior" .... – Alex

Respuesta

15

Los métodos de extensión solo se pueden definir en una clase estática externa no genérica (no anidada).

Lo que suelo hacer en tales escenarios es crear una clase interna estática separada en un espacio de nombres diferente en el mismo archivo, luego incluir ese espacio de nombres solo en ese archivo.

Todavía sería visible para otras clases en ese ensamblado; la única forma de evitar eso es mover la clase de consumo (class A en su ejemplo) a su propio ensamblado, lo que probablemente no desee hacer.

9

Declare sus Métodos de extensión en un espacio de nombres separado, y puede incluir ese espacio de nombres en archivos específicos que desee usar. Luego, declare ClassA (la clase en la que desea usar sus métodos de extensión) en un archivo separado, y use ese espacio de nombres en la parte superior de ClassA.cs. De esta forma, solo esa clase tendrá acceso a esos métodos de extensión.

Editar:

algo como lo siguiente

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. 
} 
Cuestiones relacionadas