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); } } }
================================
過去の記事については、以下のページからご参照下さい。
- いろいろ備忘録日記まとめ
サンプルコードは、以下の場所で公開しています。
- いろいろ備忘録日記サンプルソース置き場