添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
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 一些代表性功能。 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)

  •