2012-01-31 3 views
39

Я хочу скрыть общедоступные методы из списка членов intellisense. Я создал атрибут, который при применении к методу вызовет вызов метода при его создании. Я сделал это, чтобы лучше поддерживать частичные классы. Проблема в том, что в некоторых средах (например, Silverlight) отражение не может получить доступ к частным членам, даже к дочерним классам. Это проблема, поскольку вся работа выполняется в базовом классе. Я должен сделать эти методы общедоступными, но я хочу, чтобы они были скрыты от intellisense, подобно тому, как работает атрибут Obsolete. Честно говоря, потому что я анал об инкапсуляции объектов. Я пробовал разные вещи, но на самом деле ничего не получилось. Метод все еще отображается в раскрывающемся списке участников.Как скрыть общедоступные методы от intellisense

Как заставить публичные методы появляться в intellisense, когда я не хочу, чтобы их вызывали клиенты? Как это для real вопрос, Филистимляны! Это также может относиться к свойствам MEF, которые должны быть общедоступными, хотя иногда вы хотите скрыть их от клиентов.

Обновление: Я созрел как разработчик с тех пор, как я разместил этот вопрос. Почему я так сильно заботился о том, чтобы скрывать интерфейс, вне меня.

+2

Не обнародует их, если вы не хотите, чтобы они были доступны и б/у. – Oded

+0

Итак, вместо добавления вызовов к методам в конструкторе объекта вы добавляете атрибуты и вызываете их через отражение? Что касается вашего комментария о «улучшенных вспомогательных частичных классах», разве это не то, что для частичных методов? – cadrell0

+2

Явная реализация интерфейса может быть альтернативным подходом к рассмотрению. Затем методы не являются частью общедоступного API класса, но только видимы через интерфейс. –

ответ

-1

Чтобы расширить на мой комментарий о частичных методов. Попробуйте что-то вроде этого

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

Это, в конечном счете, то, что я сделал. * вздох * – Jordan

+0

Ну, не совсем. Я просто использовал частные методы в частичных классах, которые я вызывал из основного класса. У меня несколько частичных классов, я сумасшедший. Нужна помощь. * sigh * – Jordan

81

Использование атрибута EditorBrowsable как так будет вызывать метод не будет показана в IntelliSense:

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

Да, я пробовал это. Это не работает. Метод все еще отображается в списке участников. – Jordan

+12

@Jordan Я попробовал это сам сейчас, и он не показывает метод, когда я ссылаюсь на библиотеку библиотеки. Однако он показывает, является ли проект тем же самым решением, и я ссылаюсь на проект. –

+7

Да, это ожидаемое поведение. Он не предназначен для фильтрации элементов из * you * при написании кода! –

15

Вы ищете EditorBrowsableAttribute

В следующем примере показано, как скрыть свойство класса от IntelliSense, установив соответствующее значение для Атрибут EditorBrowsableAttribute. Сборка класса 1 в собственной сборке.

В Visual Studio создайте новое решение для Windows Application и добавьте ссылку на сборку, которая содержит Class1. В конструкторе Form1 объявите экземпляр класса 1, введите имя экземпляра и нажмите клавишу периода, чтобы активировать раскрывающийся список IntelliSense членов Class1. Свойство Age не отображается в раскрывающемся списке .

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 только скрывает метод, если вы просто импортируете DLL, а не если вы ссылаетесь на другой проект в решении, я думаю –

Смежные вопросы