Почему DispatcherObject.CheckAccess() и VerifyAccess() скрыты от Intellisense?
-
09-06-2019 - |
Вопрос
А System.Windows.Threading.DispatcherObject
класс (который DependencyObject
основано) содержит полезную функцию, называемую CheckAccess()
, который определяет, выполняется ли код в потоке пользовательского интерфейса.
Когда я хотел использовать его вчера, я был озадачен, обнаружив, что Intellisense не отображает эту функцию (и не отображает ее). VerifyAccess()
, которое выдает исключение, когда оно не находится в потоке пользовательского интерфейса), хотя оно указано в библиотеке MSDN.Я решил исследовать класс с помощью Reflector.Кажется, что рассматриваемая функция имеет EditorBrowsable(EditorBrowsableState.Never)
атрибут, прикрепленный к нему.А Dispatcher
класс, который используется DispatcherObject
, имеет тот же атрибут, прикрепленный к CheckAccess()
и VerifyAccess()
:
public abstract class DispatcherObject
{
// ...
[EditorBrowsable(EditorBrowsableState.Never)]
public bool CheckAccess();
[EditorBrowsable(EditorBrowsableState.Never)]
public void VerifyAccess();
// ...
[EditorBrowsable(EditorBrowsableState.Advanced)]
public Dispatcher Dispatcher { get; }
}
public sealed class Dispatcher
{
// ...
[EditorBrowsable(EditorBrowsableState.Never)]
public bool CheckAccess();
[EditorBrowsable(EditorBrowsableState.Never)]
public void VerifyAccess();
// ...
}
Я не верю, что применение этого атрибута является случайным (или шуткой), поэтому мой вопрос:почему оно там?Разве эти методы не следует вызывать напрямую?Тогда почему они не protected
(или internal
, как некоторые из наиболее полезных методов WPF)?
Решение
Сотрудник Microsoft недавно заявил CheckAccess используется только для «продвинутых сценариев», поэтому от Intellisense его скрыли.
«CheckAccess и VerifyAccess всегда были помечены как невидимые, возможно, Intellisense не уважал его.Вы можете использовать Reflector для подтверждения.Идея состоит в том, что CheckAccess и VerifyAccess - это сценарии достижений, которые не нужны нормальным разработчикам.
Тем не менее, я думаю, что editorbrowsablestate.advanced был бы более подходящим уровнем ».
Microsoft Connect может устранить этот недостаток. Голосуйте за это если это важно для тебя.
Другие советы
Я не могу найти документацию, в которой говорится, что вам не следует использовать эти методы напрямую, но я искал не очень долго.
Также вы ссылаетесь на EditorVisibleAttribute, которого не существует.Согласно Reflector, это РедакторBrowsableAttribute.
Разборка отражателя:
[EditorBrowsable(EditorBrowsableState.Never)]
public bool CheckAccess()
{
//CODE
}