System.Type クラス
この記事では、この API のリファレンス ドキュメントへの補足的な解説を提供します。
この Type クラスは機能の System.Reflection ルートであり、メタデータにアクセスするための主要な方法です。 型宣言に関する情報、型のメンバー (コンストラクター、メソッド、フィールド、プロパティ、クラスのイベントなど) に関する情報、およびクラスが配置されているモジュールとアセンブリに関する情報を取得するには、そのメンバー Type を使用します。
コードがリフレクションを使用して、アクセス レベルに関係なく、型とそのメンバーに関する情報を取得するためのアクセス許可は必要ありません。 コードがリフレクションを使用してパブリック メンバーにアクセスしたり、通常のコンパイル時にアクセス レベルが表示される他のメンバーにアクセスしたりするために、アクセス許可は必要ありません。 ただし、リフレクションを使用して、プライベートメソッドや内部メソッド、クラスが継承しない型の保護されたフィールドなど、通常アクセスできないメンバーにアクセスするには、コードに ReflectionPermission. リフレクトのセキュリティに関する考慮事項を参照してください。
Type
は、複数の実装を可能にする抽象基本クラスです。 システムは常に派生クラス RuntimeType
を提供します。 リフレクションでは、Runtime という単語で始まるすべてのクラスは、システム内のオブジェクトごとに 1 回だけ作成され、比較操作をサポートします。
Note
マルチスレッド シナリオでは、データへのアクセスを同期するためにオブジェクトをstatic
ロックTypeしないでください。 コントロールがない他のコードでは、クラスの型もロックされる可能性があります。 これにより、デッドロックが発生する可能性があります。 代わりに、プライベート static
オブジェクトをロックして静的データへのアクセスを同期します。
Note
派生クラスは、呼び出し元のコードの基底クラスの保護されたメンバーにアクセスできます。 また、呼び出し元のコードのアセンブリのアセンブリ メンバーへのアクセスも許可されます。 原則として、事前バインドされたコードでアクセスが許可されている場合は、遅延バインディング コードでもアクセスが許可されます。
Note
他のインターフェイスを拡張するインターフェイスは、拡張インターフェイスで定義されているメソッドを継承しません。
Type オブジェクトが表す型は何ですか?
このクラスはスレッド セーフです。複数のスレッドは、この型のインスタンスから同時に読み取ることができます。 クラスのインスタンスは Type 、次のいずれかの型を表すことができます。
- クラス
- 値型
- 配列
- インターフェイス
- 列挙
- デリゲート
- 構築されたジェネリック型とジェネリック型の定義
- 構築されたジェネリック型、ジェネリック型定義、およびジェネリック メソッド定義の型引数と型パラメーター
Type オブジェクトを取得する
特定の型に関連付けられているオブジェクトは Type 、次の方法で取得できます。
インスタンス メソッドは、インスタンス Object.GetType の Type 型を表すオブジェクトを返します。 すべてのマネージド型は派生 Objectしているため、任意の GetType 型のインスタンスでメソッドを呼び出すことができます。
次の例では、メソッドを Object.GetType 呼び出して、オブジェクト配列内の各オブジェクトのランタイム型を決定します。
object[] values = { "word", true, 120, 136.34, 'a' }; foreach (var value in values) Console.WriteLine("{0} - type {1}", value, value.GetType().Name); // The example displays the following output: // word - type String // True - type Boolean // 120 - type Int32 // 136.34 - type Double // a - type Char
let values: obj[] = [| "word"; true; 120; 136.34; 'a' |] for value in values do printfn $"{value} - type {value.GetType().Name}" // The example displays the following output: // word - type String // True - type Boolean // 120 - type Int32 // 136.34 - type Double // a - type Char
Module Example1 Public Sub Main() Dim values() As Object = { "word", True, 120, 136.34, "a"c } For Each value In values Console.WriteLine("{0} - type {1}", value, value.GetType().Name) Next End Sub End Module ' The example displays the following output: ' word - type String ' True - type Boolean ' 120 - type Int32 ' 136.34 - type Double ' a - type Char
静的 Type.GetType メソッドは、完全修飾名で指定された型を表すオブジェクトを返 Type します。
、Module.GetTypeおよびModule.FindTypesメソッドはModule.GetTypes、モジュールで定義されている型を表すオブジェクトを返
Type
します。 最初のメソッドを使用して、モジュールで定義されているすべてのパブリック型とプライベート型のオブジェクトの配列 Type を取得できます。 (インスタンスはModule
、メソッドまたはAssembly.GetModulesプロパティをAssembly.GetModule使用してType.Module取得できます)。このSystem.Reflection.Assemblyオブジェクトには、アセンブリで定義されているクラスを取得するためのメソッドが多数含まれています。これには Assembly.GetType、、 Assembly.GetTypesAssembly.GetExportedTypes
このメソッドは FindInterfaces 、型でサポートされているインターフェイス型のフィルター処理された一覧を返します。
このメソッドは GetElementType 、要素を
Type
表すオブジェクトを返します。メソッド GetInterfaces は GetInterface 、型でサポートされているインターフェイス型を表すオブジェクトを返 Type します。
このメソッドは GetTypeArray 、任意のオブジェクト セット Type で指定された型を表すオブジェクトの配列を返します。 オブジェクトは、型 Objectの配列で指定されます。
GetTypeFromProgID COM の相互運用性のために、およびGetTypeFromCLSIDメソッドが用意されています。 または
CLSID
で指定された型を表すオブジェクトをProgID
返Typeします。このメソッドは GetTypeFromHandle 相互運用性のために提供されています。 クラス ハンドルで
Type
指定された型を表すオブジェクトを返します。C#
typeof
演算子、C++typeid
演算子、および Visual BasicGetType
演算子は、型のオブジェクトをType
取得します。このメソッドはMakeGenericType、構築されたジェネリック型を表すオブジェクトを返Typeします。これは、プロパティが返
true
された場合はオープン構築型で、それ以外の場合ContainsGenericParametersは閉じた構築型です。 ジェネリック型は、閉じている場合にのみインスタンス化できます。、およびメソッドはMakeArrayType、それぞれ、指定した型の配列、指定した型へのポインター、および参照パラメーターの型を表すオブジェクトを返Typeします (
ref
Visual Basic では C#、F#ByRef
では 'byrefMakeByRefType')。 MakePointerType
型オブジェクトを等しいかどうかを比較する
Type型を表すオブジェクトは一意です。つまり、同じ型を表す場合にのみ、2 つのTypeオブジェクト参照が同じオブジェクトを参照します。 これにより、参照の等価性を使用してオブジェクトを比較 Type できます。 次の例では、 Type 整数値の数を表すオブジェクトを比較して、それらが同じ型であるかどうかを判断します。
long number1 = 1635429;
int number2 = 16203;
double number3 = 1639.41;
long number4 = 193685412;
// Get the type of number1.
Type t = number1.GetType();
// Compare types of all objects with number1.
Console.WriteLine("Type of number1 and number2 are equal: {0}",
Object.ReferenceEquals(t, number2.GetType()));
Console.WriteLine("Type of number1 and number3 are equal: {0}",
Object.ReferenceEquals(t, number3.GetType()));
Console.WriteLine("Type of number1 and number4 are equal: {0}",
Object.ReferenceEquals(t, number4.GetType()));
// The example displays the following output:
// Type of number1 and number2 are equal: False
// Type of number1 and number3 are equal: False
// Type of number1 and number4 are equal: True
let number1 = 1635429L
let number2 = 16203
let number3 = 1639.41
let number4 = 193685412L
// Get the type of number1.
let t = number1.GetType()
// Compare types of all objects with number1.
printfn $"Type of number1 and number2 are equal: {Object.ReferenceEquals(t, number2.GetType())}"
printfn $"Type of number1 and number3 are equal: {Object.ReferenceEquals(t, number3.GetType())}"
printfn $"Type of number1 and number4 are equal: {Object.ReferenceEquals(t, number4.GetType())}"
// The example displays the following output:
// Type of number1 and number2 are equal: False
// Type of number1 and number3 are equal: False
// Type of number1 and number4 are equal: True
Module Example
Public Sub Main()
Dim number1 As Long = 1635429
Dim number2 As Integer = 16203
Dim number3 As Double = 1639.41
Dim number4 As Long = 193685412
' Get the type of number1.
Dim t As Type = number1.GetType()
' Compare types of all objects with number1.
Console.WriteLine("Type of number1 and number2 are equal: {0}",
Object.ReferenceEquals(t, number2.GetType()))
Console.WriteLine("Type of number1 and number3 are equal: {0}",
Object.ReferenceEquals(t, number3.GetType()))
Console.WriteLine("Type of number1 and number4 are equal: {0}",
Object.ReferenceEquals(t, number4.GetType()))
End Sub
End Module
' The example displays the following output:
' Type of number1 and number2 are equal: False
' Type of number1 and number3 are equal: False
' Type of number1 and number4 are equal: True
.NET