Подтвердить что ты не робот

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

Трюк IHideObjectMembers (a.k.a 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 Express и VS 2008 Standard. Тем не менее, никто не скрывается от IntelliSense вообще. Я использовал EditorBrowsableAttribute в разных проектах, и он всегда работал хорошо; однако это не работает в этом конкретном сценарии.

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

Я что-то упустил?


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

4b9b3361

Ответ 1

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

var x = new SomeClass();

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

ISomeInterface x = new SomeClass();

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

Daniel Cazzulino явно ссылается на интерфейсы в своем сообщении

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

Ответ 2

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

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

  • Трюк IHideObjectMembers работает только из "других" сборок и только тогда, когда проект, который использует IHideObjectMembers, не загружается в одно и то же решение.

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

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

Ответ 3

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