C# 反射
C# 反射
在 C# 中,反射是一个在运行时获取类型元数据的过程。 System.Reflection 命名空间包含反射所需的类,例如:
输入
会员信息
构造函数信息
方法信息
字段信息
属性信息
类型信息
事件信息
模块
组装
程序集名称
指针等
System.Reflection.Emit 命名空间包含发出元数据的类。
C# Type class
C# Type class 表示类类型、接口类型、枚举类型、数组类型、值类型等的类型声明。它位于 System 命名空间中.它继承了 System.Reflection.MemberInfo 类。
C# Type 属性
Type 类的重要属性列表如下:
Property |
Description |
Assembly |
获取此类型的程序集。 |
AssemblyQualifiedName |
获取此类型的程序集限定名称。 |
Attributes |
获取与类型关联的属性。 |
BaseType |
获取基本类型或父类型。 |
FullName |
获取类型的完全限定名称。 |
IsAbstract |
用于检查类型是否为Abstract。 |
IsArray |
用于检查类型是否为Array。 |
IsClass |
用于检查类型是否为Class。 |
IsEnum |
用于检查类型是否为Enum。 |
IsInterface |
用于检查类型是否为Interface。 |
IsNested |
用于检查类型是否为Nested。 |
IsPrimitive |
用于检查类型是否为Primitive。 |
IsPointer |
用于检查类型是否为Pointer。 |
IsNotPublic |
用于检查类型是否不是Public。 |
IsPublic |
用于检查类型是否为Public。 |
IsSealed |
用于检查类型是否为Sealed。 |
IsSerializable |
用于检查类型是否可序列化。 |
MemberType |
用于检查类型是否为嵌套类型的成员类型。 |
Module |
获取类型的模块。 |
Name |
获取类型的名称。 |
Namespace |
获取类型的命名空间。 |
C# Type Methods
Type 类的重要方法列表如下:
方法 |
说明 |
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);
}
}
输出:
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);
Console.WriteLine("Constructors of {0} type...", t);
ConstructorInfo[] ci = t.GetConstructors(BindingFlags.public | BindingFlags.Instance);
foreach (ConstructorInfo c in ci)
{
Console.WriteLine(c);
}
}
}
输出:
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);
Console.WriteLine("Methods of {0} type...", t);
MethodInfo[] ci = t.GetMethods(BindingFlags.public | BindingFlags.Instance);
foreach (MethodInfo m in ci)
{
Console.WriteLine(m);
}
}
}
输出:
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);
Console.WriteLine("Fields of {0} type...", t);
FieldInfo[] ci = t.GetFields(BindingFlags.public | BindingFlags.static | BindingFlags.NonPublic);
foreach (FieldInfo f in ci)
{
Console.WriteLine(f);
}
}
}
输出:
Fields of System.String type...
System.String Empty
Int32 TrimHead
Int32 TrimTail
Int32 TrimBoth
Int32 charPtrAlignConst
Int32 alignConst