Как скрыть общедоступные методы от IntelliSense

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

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

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


person Jordan    schedule 31.01.2012    source источник
comment
Не делайте их общедоступными, если вы не хотите, чтобы они были доступны / использовались.   -  person Oded    schedule 01.02.2012
comment
Значит, вместо того, чтобы просто добавлять вызовы методов в конструкторе объекта, вы добавляете атрибуты и вызываете их через отражение? Что касается вашего комментария о лучшей поддержке частичных классов, разве не для этого нужны частичные методы?   -  person cadrell0    schedule 01.02.2012
comment
Альтернативным подходом может быть явная реализация интерфейса. В этом случае методы не являются частью общедоступного API класса, а видны только через интерфейс.   -  person Anthony Pegram    schedule 01.02.2012
comment
@AnthonyPegram, я пробовал это, но это привело к аналогичной проблеме с доступом к отражению. Кажется, что отражение в определенных сценариях может получить доступ только к открытым членам других классов (даже к дочерним классам).   -  person Jordan    schedule 01.02.2012
comment
@ cadrell0, частичные методы не мультиплексируются? Кроме того, я провел временные тесты между моим атрибутом и явным вызовом из основного конструктора, и разница незначительна. Этот метод делает мой код намного чище при генерации кода.   -  person Jordan    schedule 01.02.2012
comment
@Jordan Извините, я предполагал, что в классе две части. Если у вас их несколько, вы можете просто сделать это на частном мероприятии.   -  person cadrell0    schedule 01.02.2012
comment
@ cadrell0, а что-то бы мероприятие зацепить бы. По неизвестным причинам я хотел, чтобы первичный класс игнорировал частичные классы. Я не думаю, что инкапсуляцию следует доводить до такого уровня. Я страдал от программного ОКР или чего-то в этом роде. Я слишком много программировал сегодня. Теперь я поправился.   -  person Jordan    schedule 01.02.2012
comment
@Jordan Мне повезло, что у меня есть коллеги, которые бьют меня по голове, когда я начинаю заниматься проектированием.   -  person cadrell0    schedule 01.02.2012


Ответы (3)


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

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
    }
}
person cadrell0    schedule 31.01.2012
comment
В конечном итоге это то, что я сделал. вздох - person Jordan; 01.02.2012
comment
Не совсем так. Я просто использовал частные методы в частичных классах, которые я вызвал из основного класса. У меня несколько неполных классов, я сумасшедший. Нужна помощь. вздох - person Jordan; 01.02.2012

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

[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
public void MyMethod()
{
}
person Adi Lester    schedule 31.01.2012
comment
Да, я пробовал это. Не работает. Метод по-прежнему отображается в списке участников. - person Jordan; 01.02.2012
comment
@Jordan Я сам пробовал только сейчас, и он не показывает метод, когда я ссылаюсь на dll библиотеки. Однако он показывает, находится ли проект в том же решении, и я ссылаюсь на проект. - person Adi Lester; 01.02.2012
comment
Да, это ожидаемое поведение. Он не предназначен для фильтрации элементов от вас при написании кода! - person Cody Gray; 01.02.2012
comment
Верно. Я нарушаю правила ООП ради более чистого кода. Я страдаю программным ОКР или чем-то в этом роде. - person Jordan; 01.02.2012
comment
Раньше он работал в VB.Net и более старых версиях Visual Studio, но затем они изменили его и включили неправильное поведение C #, где оно больше не соблюдается, если проект находится в том же решении. И нет даже возможности выбрать поведение. :-( - person Christoph; 09.11.2018

Вы ищете EditorBrowsableAttribute

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

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

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;
                }
            }
        }
    }
}
person SimSimY    schedule 31.01.2012
comment
editorbrowsable только скрывает метод, если вы просто импортируете dll, а не если вы ссылаетесь на другой проект в решении, я думаю - person Isaac Bolinger; 06.06.2012