いろいろ備忘録日記

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

.NET クラスライブラリ探訪-008 (System.Type)(01)

System.Typeクラスは文字通り型を表すクラスです。
このクラスのインスタンスからは、その型を表す
情報(コンストラクタやメソッド、フィールドの情報)が
取得できます。リフレクション処理を行う際に必須となる
クラスです。
Typeオブジェクトは以下の方法で通常取得します。


(1) インスタンス化されているものの場合

  • instance.GetType()

(2) インスタンス化されていないものの場合

  • typeof(Clazz)

(3) 文字列から生成

  • Type.GetType("System.String");


ジェネリック型のTypeオブジェクトを構築する方法に
ついては、以下を参照願います。


また、ドキュメントに記載されているように
System.Typeクラスはスレッドセーフとなっています。


Typeクラスは、非常に多くのプロパティおよびメソッドが
あり、しかもどれも重要なものばかりなので2回に分けてやります。
今回は、プロパティについてです。


このクラスについては、System.Reflection名前空間のクラス達を
勉強する際にもう一度詳しく記述したいと思います。


以下サンプル.

// vim:set ts=4 sw=4 et ws is nowrap ft=cs:

using System;

using Gsf.Research.ClassLibrary;

namespace Gsf.Research.ClassLibrary.System{

    /// <summary>
    /// System.Typeクラスのサンプルです。
    /// </summary>
    /// <remarks>
    /// System.Typeクラスは文字通り型を表すクラスです。
    /// このクラスのインスタンスからは、その型を表す
    /// 情報(コンストラクタやメソッド、フィールドの情報)が
    /// 取得できます。リフレクション処理を行う際に必須となる
    /// クラスです。
    /// Typeオブジェクトは以下の方法で通常取得します。
    ///
    /// (1) インスタンス化されているものの場合
    /// -instance.GetType()
    ///
    /// (2) インスタンス化されていないものの場合
    /// -typeof(Clazz)
    ///
    /// ジェネリック型のTypeオブジェクトを構築する方法に
    /// ついては、以下を参照願います。
    /// -http://d.hatena.ne.jp/gsf_zero1/20070228/p1
    ///
    /// また、ドキュメントに記載されているように
    /// System.Typeクラスはスレッドセーフとなっています。
    ///
    /// Typeクラスは、非常に多くのプロパティおよびメソッドが
    /// あり、しかもどれも重要なものばかりなので2回に分けてやります。
    /// 今回は、プロパティについてです。
    /// </remarks>
    public class TypeResearch00 : IExecutable{

        /// <summary>
        /// 処理を実行します。
        /// </summary>
        public void Execute(){
            //
            // Typeオブジェクトの取得.
            //
            // 以下の用に文字列から型情報を取得することも可能です。
            //
            // Type type = Type.GetType("Gsf.Research.ClassLibrary.System.Sample");
            //
            // [補足]
            // ジェネリック型の型情報を生成するには、以下の記事を参考にしてください。
            // 
            // [ジェネリックな型を動的に作成する(Type, Activator, Generic)]
            // http://d.hatena.ne.jp/gsf_zero1/20070228/p1
            //
            Type type = typeof(Sample);

            //
            // FullNameプロパティ.
            //
            // 型についての名前空間も含めた完全名を返します。
            //
            Console.WriteLine(type.FullName);

            //
            // AssemblyQualifiedNameプロパティ
            //
            // Assemblyの名前も含む、typeのアセンブリ修飾名を取得します。
            //
            Console.WriteLine(type.AssemblyQualifiedName);

            //
            // Assemblyプロパティ
            //
            // 型が宣言されているAssemblyオブジェクトを取得します.
            //
            Console.WriteLine(type.Assembly.FullName);

            //
            // BaseTypeプロパティ
            //
            // 型の直接の親クラスの型を取得します。
            //
            Console.WriteLine(type.BaseType.FullName);

            //
            // IsXXXXプロパティ
            //
            // System.Typeには、特定の型を確認するための
            // IsXXXX系プロパティが沢山あります。
            //
            // そのうち、主なものをいくつか記述。
            //
            // 型がabstractかどうかを確認
            Console.WriteLine("abstract? = {0}",   type.IsAbstract);
            // 型が配列かどうかを確認
            Console.WriteLine("array? = {0}",      type.IsArray);
            // 型がクラスであるかどうかを確認(値型(struct)やインターフェースでないことを確認)
            Console.WriteLine("class? = {0}",      type.IsClass);
            // 型が列挙体(enum)であるかどうかを確認
            Console.WriteLine("enum? = {0}",       type.IsEnum);
            // 型がジェネリック型であるかどうかを確認
            Console.WriteLine("generic? = {0}",    type.IsGenericType);
            // 型がインターフェースかどうかを確認
            Console.WriteLine("interface? = {0}",  type.IsInterface);
            // 基本型かどうかを確認
            Console.WriteLine("primitive? = {0}",  type.IsPrimitive);
            // 型がpublicで宣言されているかどうかを確認
            Console.WriteLine("public? = {0}",     type.IsPublic);
            // 型がsealedされているかどうかを確認
            Console.WriteLine("sealed? = {0}",     type.IsSealed);
            // 型が値型(struct)かどうかを確認
            Console.WriteLine("value type? = {0}", type.IsValueType);

        }
    }

    /// <summary>
    /// サンプル用クラスです。
    /// </summary>
    internal class Sample{
        int    _id;
        string _name;

        public Sample() : this(0, null){
            // nop;
        }

        public Sample(int id, string name){
            _id   = id;
            _name = name;
        }

        public int Id{
            get{
                return _id;
            }
            set{
                _id = value;
            }
        }

        public string Name{
            get{
                return _name;
            }
            set{
                _name = value;
            }
        }

        public override string ToString(){
            return string.Format("id:{0}, name:{1}", _id, _name);
        }
    }
}

================================
過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。