いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

特定のプロパティやメソッドをインテリセンス上で非表示にする. (EditorBrowsable, EditorBrowsableState.Never, Intellisense)


以下、メモ書きです。
特定のクラス全体もしくはプロパティ・メソッド単位でインテリセンス上で非表示にするには、以下の属性を
使用します。

System.ComponentModel.EditorBrowsableAttribute


この属性を指定する際には、EditorBrowsableStateの列挙型を指定して表示モードを
指定しています。EditorBrowsableState.Neverを指定すると完全に非表示になります。


ただし、この属性をVisual C#で利用する場合は注意が必要になります。
MSDNのEditorBrowsableの説明の箇所に以下の文言があります。

Visual C# では、EditorBrowsableAttribute は同じアセンブリのクラスのメンバは非表示になりません。

これ、間違いやすいので注意が必要です。
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=2803030&SiteID=1 にもあるとおり
非表示になっているかどうかを確認するには、参照設定にてプロジェクトで追加するのではなくて
参照タブから、実際のアセンブリ(DLL、EXE)を直接指定する必要があります。
(プロジェクトで指定した場合は、EditorBrowsableAttributeを指定していても非表示になりません。)
VBとかの場合は非表示になるみたいですね。)


以下、サンプルです。

クラスライブラリ側:[ClassLibrary1.dll]

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:
using System;
using System.ComponentModel;

namespace ClassLibrary1 {

    public class Demo {

        public const string A_CONST_VALUE = "hoge";

        [EditorBrowsable(EditorBrowsableState.Never)]
        public string PropertyValue {
            get;
            set;
        }

        [EditorBrowsable(EditorBrowsableState.Never)]
        public void MethodA() {
            //
            // nop.
            //
        }
    }

    [EditorBrowsable(EditorBrowsableState.Never)]
    public class Demo2 {

        public const string A_CONST_VALUE = "hoge";

        public string PropertyValue {
            get;
            set;
        }

        public void MethodA() {
            //
            // nop.
            //
        }
    }

}


利用する側:[ConsoleApplication1.exe]

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:
using System;
using System.ComponentModel;

namespace ConsoleApplication1 {

    using ClassLibrary1;

    class Program {

        static void Main(string[] args) {

            Demo  d  = new Demo();
            Demo2 d2 = new Demo2();

            //
            // 以下のどちらもインテリセンスには表示されない。
            //
            //d.MethodA();
            //d2.MethodA();

            //
            // 以下はどちらもインテリセンスに表示される。
            //
            Console.WriteLine(Demo.A_CONST_VALUE);
            Console.WriteLine(Demo2.A_CONST_VALUE);
        }
    }

}