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
в этом классе, так как в этом не должно быть необходимости.
Ответы
Ответ 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, то трюк должен работать на вас.