在C#中,反射是一个进程,用于在运行时获取某个类型的元数据。System.Refltion命名空间包含反射所需的类,例如:
- Type
- MemberInfo
- ConstructorInfo
- MethodInfo
- FieldInfo
- PropertyInfo
- TypeInfo
- EventInfo
- Module
- Assembly
- AssemblyName
- Pointer etc.
System.Reflection.Emit命名空间包含用于发射元数据的类。
C#类型类
C#类型类表示类类型、接口类型、枚举类型、数组类型、值类型等的类型声明。位于 System 命名空间中。它继承 System.Reflection.MemberInfo 类。
C#类型属性
下面列出了Type类的重要属性:
| Property | Description |
|---|---|
| Assembly | 获取此类型的程序集。 |
| AssemblyQualifiedName | 获取此类型的程序集限定名称。 |
| Attributes | 获取与类型关联的属性。 |
| BaseType | 获取基类型或父类型。 |
| FullName | 获取类型的完全限定名称。 |
| IsAbstract | 用于检查类型是否为抽象。 |
| IsArray | 用于检查类型是否为 Array。 |
| IsClass | 用于检查类型是否为 Class。 |
| IsEnum | 用于检查类型是否为 Enum。 |
| IsInterface | 用于检查类型是否为接口。 |
| IsNested | 用于检查类型是否为嵌套。 |
| IsPrimitive | 用于检查类型是否为 Primitive。 |
| IsPointer | 用于检查类型是否为Pointer。 |
| IsNotPublic | 用于检查类型是否不是Public。 |
| IsPublic | 用于检查类型是否为 Public。 |
| IsSealed | 用于检查类型是否为密封。 |
| IsSerializable | 用于检查类型是否可序列化。 |
| MemberType | 用于检查类型是否为嵌套类型的成员类型。 |
| Module | 获取类型的模块。 |
| Name | 获取类型的名称。 |
| Namespace | 获取类型的命名空间。 |
C#类型方法
Type类的重要方法列表如下:
| Method | Description |
|---|---|
| GetConstructors() | 返回该类型的所有公共构造函数。 |
| GetConstructors(BindingFlags) | 返回具有指定 BindingFlags 的 Type 的所有构造函数. |
| GetFields() | 返回该类型的所有公共字段。 |
| GetFields(BindingFlags) | 返回具有指定 BindingFlags 的 Type 的所有公共构造函数。 |
| GetMembers() | 返回该类型的所有公共成员。 |
| GetMembers(BindingFlags) | 返回具有指定 BindingFlags 的 Type 的所有成员。 |
| GetMethods() | 返回该类型的所有公共方法。 |
| GetMethods(BindingFlags) | 返回具有指定 BindingFlags 的 Type 的所有方法。 |
| GetProperties() | 返回该类型的所有公共属性。 |
| GetProperties(BindingFlags) | 返回具有指定 BindingFlags 的 Type 的所有属性。 |
| GetType() | 获取当前类型。 |
| GetType(String) | 获取给定名称的类型。 |
C#反射示例:获取类型
using System; public class ReflectionExample { public static void Main() { int a = 10; Type type = a.GetType(); Console.WriteLine(type); } }
输出:
System.Int32
C#反射示例:获取程序集
using System; using System.Reflection; public class ReflectionExample { public static void Main() { Type t = typeof(System.String); Console.WriteLine(t.Assembly); } }
输出:
mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
C#反射示例:打印类型信息
using System; using System.Reflection; public class ReflectionExample { public static void Main() { Type t = typeof(System.String); Console.WriteLine(t.FullName); Console.WriteLine(t.BaseType); Console.WriteLine(t.IsClass); Console.WriteLine(t.IsEnum); Console.WriteLine(t.IsInterface); } }
输出:
System.String System.Object true false false
C#反射示例:打印构造函数
using System;
using System.Reflection;
public class ReflectionExample
{
public static void Main()
{
Type t = typeof(System.String);
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Constructors of {0} type..."</span><span class="pun">,</span><span class="pln"> t</span><span class="pun">);</span><span class="pln">
</span><span class="typ">ConstructorInfo</span><span class="pun">[]</span><span class="pln"> ci </span><span class="pun">=</span><span class="pln"> t</span><span class="pun">.</span><span class="typ">GetConstructors</span><span class="pun">(</span><span class="typ">BindingFlags</span><span class="pun">.</span><span class="typ">Public</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">BindingFlags</span><span class="pun">.</span><span class="typ">Instance</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="typ">ConstructorInfo</span><span class="pln"> c </span><span class="kwd">in</span><span class="pln"> ci</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">c</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
}
输出:
Constructors of System.String type... Void .ctor(Char*) Void .ctor(Char*, Int32, Int32) Void .ctor(SByte*) Void .ctor(SByte*, Int32, Int32) Void .ctor(SByte*, Int32, Int32, System.Text.Encoding) Void .ctor(Char[], Int32, Int32) Void .ctor(Char[]) Void .ctor(Char, Int32)
C#反射示例:打印方法
using System;
using System.Reflection;
public class ReflectionExample
{
public static void Main()
{
Type t = typeof(System.String);
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Methods of {0} type..."</span><span class="pun">,</span><span class="pln"> t</span><span class="pun">);</span><span class="pln">
</span><span class="typ">MethodInfo</span><span class="pun">[]</span><span class="pln"> ci </span><span class="pun">=</span><span class="pln"> t</span><span class="pun">.</span><span class="typ">GetMethods</span><span class="pun">(</span><span class="typ">BindingFlags</span><span class="pun">.</span><span class="typ">Public</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">BindingFlags</span><span class="pun">.</span><span class="typ">Instance</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="typ">MethodInfo</span><span class="pln"> m </span><span class="kwd">in</span><span class="pln"> ci</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">m</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
}
输出:
Methods of System.String type... Boolean Equals(System.Object) Boolean Equals(System.String) Boolean Equals(System.String, System.StringComparison) Char get_Chars(Int32) Void copyTo(Int32, char[], Int32, Int32) Char[] ToCharArray() ....
C#反射示例:打印字段
using System;
using System.Reflection;
public class ReflectionExample
{
public static void Main()
{
Type t = typeof(System.String);
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Fields of {0} type..."</span><span class="pun">,</span><span class="pln"> t</span><span class="pun">);</span><span class="pln">
</span><span class="typ">FieldInfo</span><span class="pun">[]</span><span class="pln"> ci </span><span class="pun">=</span><span class="pln"> t</span><span class="pun">.</span><span class="typ">GetFields</span><span class="pun">(</span><span class="typ">BindingFlags</span><span class="pun">.</span><span class="typ">Public</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">BindingFlags</span><span class="pun">.</span><span class="typ">Static</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">BindingFlags</span><span class="pun">.</span><span class="typ">NonPublic</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">foreach</span><span class="pln"> </span><span class="pun">(</span><span class="typ">FieldInfo</span><span class="pln"> f </span><span class="kwd">in</span><span class="pln"> ci</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">f</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
}
输出:
Fields of System.String type... System.String Empty Int32 TrimHead Int32 TrimTail Int32 TrimBoth Int32 charPtrAlignConst Int32 alignConst