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
Object

以下示例显示了 的一些代表性功能 Type 。 中的 C# typeof ( GetType 运算符Visual Basic) 获取 Type 表示 的对象 String 。 从此 Type 对象中, GetMethod 方法用于获取表示采用 MethodInfo String.Substring 起始位置和长度的重载的 。

为了标识重载签名,代码示例创建了一个临时数组,其中包含两个 对象, Type int 表示 ( Integer 中的Visual Basic) 。

更准确地说,数组包含对 在当前应用程序域中表示的 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". 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 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 构造类型。 泛型类型只有在关闭时才能实例化。

  • 、 和 方法返回对象,这些对象分别表示指定类型的数组、指向指定类型的指针,以及 C# 中引用参数 (的类型 MakeArrayType MakePointerType MakeByRefType Type ref 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 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)

  •