public ref class Type abstract
public ref class Type abstract : System::Reflection::MemberInfo, System::Reflection::IReflect
public ref class Type abstract : System::Reflection::MemberInfo, System::Reflection::IReflect, System::Runtime::InteropServices::_Type
public abstract class Type
public abstract class Type : System.Reflection.MemberInfo, System.Reflection.IReflect
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
[System.Serializable]
public abstract class Type : System.Reflection.MemberInfo, System.Reflection.IReflect, System.Runtime.InteropServices._Type
[System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)]
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public abstract class Type : System.Reflection.MemberInfo, System.Reflection.IReflect, System.Runtime.InteropServices._Type
type Type = class
type Type = class
inherit MemberInfo
interface IReflect
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)>]
[<System.Serializable>]
type Type = class
inherit MemberInfo
interface _Type
interface IReflect
[<System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)>]
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type Type = class
inherit MemberInfo
interface _Type
interface IReflect
Public MustInherit Class Type
Public MustInherit Class Type
Inherits MemberInfo
Implements IReflect
Public MustInherit Class Type
Inherits MemberInfo
Implements _Type, IReflect
以下示例演示 的
Type
一些代表性功能。 Visual Basic)
GetType
中的 C#
typeof
运算符 (运算符用于获取
Type
表示 的对象
String
。 从此
Type
对象中
GetMethod
, 方法用于获取表示
MethodInfo
String.Substring
采用起始位置和长度的重载的 。
为了标识重载签名,代码示例创建一个临时数组,其中包含两
Type
个对象,这些
int
对象表示 Visual Basic)
Integer
中的 (。
确切地说, 数组包含对 实例的两个引用,这些实例
Type
表示
int
在当前应用程序域中。 对于任何类型,每个应用程序域都只有一个 实例
Type
。
该代码示例使用
MethodInfo
调用
Substring
字符串“Hello, World!”上的 方法,并显示结果。
#using <System.dll>
using namespace System;
using namespace System::Reflection;
void main()
// Get a Type object representing the System.String type.
Type^ t = String::typeid;
MethodInfo^ substr = t->GetMethod("Substring",
gcnew array<Type^> { int::typeid, int::typeid });
Object^ result =
substr->Invoke("Hello, World!", gcnew array<Object^> { 7, 5 });
Console::WriteLine("{0} returned \"{1}\".", substr, result);
/* This code example produces the following output:
System.String Substring(Int32, Int32) returned "World".
using System;
using System.Reflection;
class Example
static void Main()
Type t = typeof(String);
MethodInfo substr = t.GetMethod("Substring",
new Type[] { typeof(int), typeof(int) });
Object result =
substr.Invoke("Hello, World!", new Object[] { 7, 5 });
Console.WriteLine("{0} returned \"{1}\".", substr, result);
/* This code example produces the following output:
System.String Substring(Int32, Int32) returned "World".
open System
let t = typeof<String>
let substr = t.GetMethod("Substring", [| typeof<int>; typeof<int> |])
let result = substr.Invoke("Hello, World!", [| 7; 5 |])
printfn $"{substr} returned \"{result}\"."
(* This code example produces the following output:
System.String Substring(Int32, Int32) returned "World".
Imports System.Reflection
Module Example
Sub Main()
Dim t As Type = GetType(String)
Dim substr As MethodInfo = t.GetMethod("Substring", _
New Type() { GetType(Integer), GetType(Integer) })
Dim result As Object = _
substr.Invoke("Hello, World!", New Object() { 7, 5 })
Console.WriteLine("{0} returned ""{1}"".", substr, result)
End Sub
End Module
' This code example produces the following output:
'System.String Substring(Int32, Int32) returned "World".
Type
是功能的根,
System.Reflection
是访问元数据的主要方式。 使用 的成员
Type
获取有关类型声明、类型 (成员的信息,例如类) 的构造函数、方法、字段、属性和事件,以及在其中部署类的模块和程序集。
代码无需任何权限即可使用反射来获取有关类型及其成员的信息,无论其访问级别如何。 代码无需任何权限即可使用反射来访问公共成员,或者访问级别会使这些成员在正常编译期间可见的其他成员。 但是,为了使代码能够使用反射来访问通常无法访问的成员,例如私有或内部方法,或者类不继承的类型的受保护字段,代码必须具有
ReflectionPermission
。 请参阅
反射的安全注意事项
。
Type
是允许多个实现的抽象基类。 系统将始终提供派生类
RuntimeType
。 在反射中,以“运行时”一词开头的所有类仅在系统中每个对象创建一次,并支持比较操作。
在多线程方案中,不要锁定
Type
对象以同步对
static
数据的访问。 你无法控制的其他代码也可能锁定类类型。 这可能会导致死锁。 而是通过锁定私有
static
对象来同步对静态数据的访问。
派生类可以访问调用代码的基类的受保护成员。 此外,允许访问调用代码程序集的程序集成员。 通常,如果允许在早期绑定代码中访问,则还允许在后期绑定代码中访问。
扩展其他接口的接口不会继承扩展接口中定义的方法。
本节内容:
Type 对象表示哪些类型?
检索 Type 对象
比较类型对象是否相等
Type 对象表示哪些类型?
此类是线程安全的;多个线程可以并发读取此类型的实例。 类的
Type
实例可以表示以下任一类型:
构造泛型类型和泛型类型定义
构造泛型类型、泛型类型定义和泛型方法定义的类型参数和类型参数
检索 Type 对象
Type
可通过以下方式获取与特定类型关联的对象:
实例
Object.GetType
方法返回一个
Type
对象,该对象表示实例的类型。 由于所有托管类型都派生自
Object
,
GetType
因此可以在任何类型的实例上调用 方法。
以下示例调用
Object.GetType
方法以确定对象数组中每个对象的运行时类型。
using namespace System;
void main()
array<Object^>^ values = { "word", true, 120, 136.34 };
for each (Object^ 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
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 Example
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)
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.GetTypes
、
Module.GetType
和
Module.FindTypes
方法返回
Type
表示模块中定义的类型的对象。 第一种方法可用于获取模块中定义的所有公共和私有类型的对象的数组
Type
。 (可以通过
Module
Assembly.GetModule
或
Assembly.GetModules
方法或通过
Type.Module
property.)
对象
System.Reflection.Assembly
包含许多方法,用于检索程序集中定义的类,包括
Assembly.GetType
、
Assembly.GetTypes
和
Assembly.GetExportedTypes
。
方法
FindInterfaces
返回类型支持的接口类型的筛选列表。
方法
GetElementType
返回表示
Type
元素的 对象。
GetInterfaces
和
GetInterface
方法返回
Type
表示类型支持的接口类型的 对象。
方法
GetTypeArray
返回对象的数组
Type
,这些对象表示由一组任意对象指定的类型。 使用 类型的
Object
数组指定对象。
GetTypeFromProgID
提供 和
GetTypeFromCLSID
方法是为了实现 COM 互操作性。 它们返回一个
Type
对象,该对象表示 或
ProgID
CLSID
指定的类型。
GetTypeFromHandle
提供 方法是为了实现互操作性。 它返回一个
Type
对象,该对象表示类句柄指定的类型。
C#
typeof
运算符、C++
typeid
运算符和 Visual Basic
GetType
运算符获取
Type
类型的 对象。
方法
MakeGenericType
返回一个
Type
对象,该对象表示构造的泛型类型(如果其属性返回 ,则返回
ContainsGenericParameters
一个开放构造类型),否则返回
true
一个闭合的构造类型。 仅当泛型类型处于关闭状态时,才能将其实例化。
MakeArrayType
、
MakePointerType
和
MakeByRefType
方法返回
Type
的对象分别表示指定类型的数组、指向指定类型的指针,以及 C# 中 (
ref
引用参数的类型、F#
ByRef
中的“byref”和 Visual Basic) 。
比较类型对象的相等性
Type
表示类型的 对象是唯一的;也就是说,当并且仅当它们表示同一类型时,两个
Type
对象引用引用同一对象。 这允许使用引用相等性比较
Type
对象。 以下示例比较
Type
表示多个整数值的对象,以确定它们是否属于同一类型。
using namespace System;
void main()
Int64 number1 = 1635429;
Int32 number2 = 16203;
double number3 = 1639.41;
Int64 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
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
实施者说明
从
Type
继承时,必须重写以下成员:
Assembly
AssemblyQualifiedName
BaseType
FullName
GetAttributeFlagsImpl()
GetConstructorImpl(BindingFlags, Binder, CallingConventions, Type[], ParameterModifier[])
GetConstructors(BindingFlags)
GetElementType()
GetEvent(String, BindingFlags)
GetEvents(BindingFlags)
GetField(String, BindingFlags)
GetFields(BindingFlags)
GetInterface(String, Boolean)
GetInterfaces()
GetMethodImpl(String, BindingFlags, Binder, CallingConventions, Type[], ParameterModifier[])
GetMethods(BindingFlags)
GetNestedType(String, BindingFlags)
GetNestedTypes(BindingFlags)
GetProperties(BindingFlags)
GetPropertyImpl(String, BindingFlags, Binder, Type, Type[], ParameterModifier[])
HasElementTypeImpl()
InvokeMember(String, BindingFlags, Binder, Object, Object[], ParameterModifier[], CultureInfo, String[])
IsArrayImpl()
IsByRefImpl()
IsCOMObjectImpl()
IsPointerImpl()
IsPrimitiveImpl()
Module
Namespace
TypeHandle
UnderlyingSystemType
GetCustomAttributes(Boolean)
GetCustomAttributes(Type, Boolean)
IsDefined(Type, Boolean)