VS IntelliSense - трюк IFluentInterface / IHideObjectMembers не работает.Зачем? - PullRequest
12 голосов
/ 31 мая 2010

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

http://i48.tinypic.com/vhb4fq.jpg

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

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


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

Ответы [ 3 ]

12 голосов
/ 25 августа 2010

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

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

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

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

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

7 голосов
/ 17 февраля 2012

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

var x = new SomeClass();

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

ISomeInterface x = new SomeClass();

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

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

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

4 голосов
/ 23 апреля 2011

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

...