无涯教程-C# - 反射

87 阅读3分钟

在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

参考链接

www.learnfk.com/csharp/c-sh…