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 { ... }

или:

public interface ISomeInterface : IHideObjectMembers { ... }

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

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

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


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

12
задан Glorfindel 28 July 2019 в 09:10
поделиться

1 ответ

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

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

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

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

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

12
ответ дан 2 December 2019 в 06:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: