VS IntelliSense - трюк IFluentInterface / IHideObjectMembers не работает. Почему?

IHideObjectMembers уловка ( иначе IFluentInterface) можно использовать, например, в реализациях свободного интерфейса, чтобы скрыть System.Object членов от IntelliSense. (Если вы не знаете этот трюк, вы можете прочитать его по указанной выше ссылке; я просто повторяю здесь обычное объявление интерфейса :)

using System;
using System.ComponentModel;

[EditorBrowsable(EditorBrowsableState.Never)]
public interface IHideObjectMembers
{
    [EditorBrowsable(EditorBrowsableState.Never)] bool Equals(object obj);
    [EditorBrowsable(EditorBrowsableState.Never)] int GetHashCode();
    [EditorBrowsable(EditorBrowsableState.Never)] Type GetType();
    [EditorBrowsable(EditorBrowsableState.Never)] string ToString();
}

Теперь я должен иметь возможность скрывать System.Object членов другого типа следующим образом:

public class SomeClass : IHideObjectMembers { ... }

or:

public interface ISomeInterface : IHideObjectMembers { ... }

Я пробовал это как в VS 2008 Express, так и в VS 2008 Standard. Однако никакие члены не скрыты от IntelliSense. Я использовал EditorBrowsableAttribute в разных проектах, и он всегда работал хорошо; однако в данном конкретном сценарии это не работает.

Если бы все работало так, как ожидалось, я бы увидел только метод SomeMethodTwo.

Я что-то упускаю?


P.S .: Вы можете вывести мой пример кода из объявлений и снимка экрана. У меня есть класс SomeClass с единственным фиктивным методом под названием SomeMethodTwo. Очень простой. Я не повторно реализовал четыре System.Object метода в этом классе, поскольку в этом нет необходимости.


person stakx - no longer contributing    schedule 31.05.2010    source источник
comment
В последних версиях Visual Studio (2015, 2017) IHideObjectMembers / IFluentInterface становится бесполезным из-за ошибки Roslyn; см. github.com/dotnet/roslyn/issues/4434.   -  person stakx - no longer contributing    schedule 27.12.2017


Ответы (3)


Уловка сработает, если вы не используете

var x = new SomeClass();

но явно используйте интерфейс, унаследованный от IHideObjectMembers

ISomeInterface x = new SomeClass();

var принимает Тип конкретного класса. Таким образом, IntelliSense будет искать object.ToString(), а не IHideObjectMembers.ToString(). Первый не украшен EditorBrowsableAttribute, а второй -.

Даниэль Каззулино прямо ссылается на интерфейсы в своем сообщении.

мы сделали это со всеми интерфейсами нашего свободного API

person Sebastian Weber    schedule 17.02.2012

Перед тем, как было опубликовано рабочее решение (см. Выше), я немного поэкспериментировал и поэкспериментировал и обнаружил следующее:

  • Необходимо указать IntelliSense игнорировать свойства, отмеченные знаком EditorBrowsableState, равным Advanced или Never. Это достигается в Visual Studio через пункт меню Инструменты Параметры ... Текстовый редактор C # IntelliSense Скрыть опытных участников.

  • Уловка IHideObjectMembers работает только с «другими» сборками и только тогда, когда проект, использующий IHideObjectMembers, не загружен в том же решении.

  • Скрытие нестатических членов object иногда не работает, если выполняется через интерфейс IHideObjectMembers, но это работает, когда методы явно переопределяются непосредственно в классе ... что, к сожалению, делает показанный метод скрытия менее полезным.

Источники этих подсказок:

person stakx - no longer contributing    schedule 24.08.2010
comment
Интересно. Мне не удалось заставить его работать вне или внутри решения с помощью VS 2010. - person Sergey Akopov; 24.03.2011
comment
+1 могу поверить, что это только второй голос за вашу работу. (Попытка диагностировать то же самое на VS10) - person Ruben Bartelink; 08.06.2011
comment
NB не было проблемой VS10 - все, что он меняет, это то, что нет параметра Hide Advanced members для проверки. Он работает до тех пор, пока не является ссылкой на проект. Один недостаток, который я заметил, заключается в том, что Ctrl., Реализация интерфейса явно теперь генерирует 4 метода (хотя он предлагает себя только в том случае, если «настоящий метод» отсутствует), но я думаю, что жизнь будет продолжаться. (То же отрицательное относится и к VS08) - person Ruben Bartelink; 08.06.2011

Этот трюк работает только тогда, когда вы используете типы, включенные в ссылочные библиотеки DLL. Эти сборки, на которые имеются ссылки, не могут быть ссылками на проекты Visual Studio. Если вы ссылаетесь на сами DLL, уловка должна сработать для вас.

person Julian Dominguez    schedule 23.04.2011