2012-01-31 15 views
39

Quiero ocultar los métodos públicos de la lista de miembros de IntelliSense. Creé un atributo que cuando se aplica a un método hará que se llame al método cuando se construye su objeto. Hice esto para apoyar mejor las clases parciales. El problema es que en algunos entornos (como Silverlight), la reflexión no puede acceder a los miembros privados, incluso a los de las clases secundarias. Esto es un problema ya que todo el trabajo se hace en una clase base. Tengo que hacer que estos métodos sean públicos, pero quiero que estén ocultos de intellisense, de forma similar a cómo funciona el atributo Obsolete. Francamente, porque soy anal sobre la encapsulación de objetos. He intentado cosas diferentes, pero nada ha funcionado realmente. El método aún aparece en el menú desplegable de miembros.Cómo ocultar los métodos públicos de IntelliSense

¿Cómo evito que los métodos públicos se muestren en intellisense cuando no deseo que los clientes los llamen? Cómo es eso de una pregunta, filisteos reales! Esto también puede aplicarse a las propiedades de MEF que deben ser públicas, aunque a veces desee ocultarlas de los clientes.

Actualización: he madurado como desarrollador ya he publicado esta pregunta. Por qué me importa tanto ocultar la interfaz me supera.

+2

no les haga público si no se desea que sean accesibles/utilizados. – Oded

+0

Así que en lugar de limitarse a añadir llamadas a métodos en el constructor de un objeto, que está añadiendo atributos y llamarlos a través de la reflexión? En cuanto a su comentario sobre "mejores clases parciales de apoyo", ¿no son para eso los métodos parciales? – cadrell0

+2

La implementación de interfaz explícita podría ser un enfoque alternativo a considerar. Los métodos entonces no son parte de la API pública de la clase, pero solo son visibles a través de la interfaz. –

Respuesta

-1

Para ampliar mi comentario acerca de los métodos parciales. Intentar algo como esto

Foo.part1.cs

partial class Foo 
{ 
    public Foo() 
    { 
     Initialize(); 
    } 

    partial void Initialize(); 
} 

Foo.part2.cs

partial class Foo 
{ 
    partial void Initialize() 
    { 
     InitializePart1(); 
     InitializePart2(); 
     InitializePart3(); 
    } 

    private void InitializePart1() 
    { 
     //logic goes here 
    } 

    private void InitializePart2() 
    { 
     //logic goes here 
    } 

    private void InitializePart3() 
    { 
     //logic goes here 
    } 
} 
+0

Esto es en última instancia lo que hice. * suspiro * – Jordan

+0

Bueno, no exactamente. Acabo de utilizar métodos privados en las clases parciales que llamé desde la clase primaria. Tengo múltiples clases parciales, estoy loco. Necesitas ayuda. * suspiro * – Jordan

81

Usando el atributo EditorBrowsable al igual que provocará un método que no se muestra en IntelliSense:

[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)] 
public void MyMethod() 
{ 
} 
+1

Sí, lo intenté. No funciona El método todavía se muestra en la lista de miembros. – Jordan

+12

@ Jordan Ya lo intenté por mi cuenta y no muestra el método cuando me refiero al dll de la biblioteca. Sin embargo, sí muestra si el proyecto está en la misma solución y estoy haciendo referencia al proyecto. –

+7

Sí, ese es el comportamiento esperado. ¡No se pretende filtrar elementos de * usted * mientras escribe el código! –

15

Usted está buscando EditorBrowsableAttribute

El siguiente ejemplo muestra cómo ocultar una propiedad de una clase de IntelliSense estableciendo el valor apropiado para el Atributo EditorBrowsableAttribute. Build Class1 en su propio ensamblaje.

En Visual Studio, cree una nueva solución de aplicación de Windows y agregue una referencia al conjunto que contiene Class1. En el constructor Form1 , declarar una instancia de Clase 1, escriba el nombre de la ejemplo, y pulse la tecla periodo para activar la lista desplegable de IntelliSense de los miembros de clase 1. La propiedad Age no aparece en en la lista desplegable.

using System; 
using System.ComponentModel; 

namespace EditorBrowsableDemo 
{ 
    public class Class1 
    { 
     public Class1() 
     { 
      // 
      // TODO: Add constructor logic here 
      // 
     } 

     int ageval; 

     [EditorBrowsable(EditorBrowsableState.Never)] 
     public int Age 
     { 
      get { return ageval; } 
      set 
      { 
       if (!ageval.Equals(value)) 
       { 
        ageval = value; 
       } 
      } 
     } 
    } 
} 
+14

editorbrowsable solo oculta el método si solo está importando el dll, no si está haciendo referencia a otro proyecto en la solución, creo –

Cuestiones relacionadas