今天上课老师讲了c#中的高级编程,讲的很透彻,我感觉c#中的反射原理,其实和我们平时用的类-实例是一样的道理,只不过现可以把其它的类作为Reflection类中的一个实例,有Reflection类对这些类进行操作,利用反射可以在运行时得到类型信息
1. 包括方法、属性、事件、字段及构造函数,还可以获得每个成员的名称、限定符和参数等信息。
2.利用反射可以在运行时根据得到的类型信息动态创建类型的实例,设置字段,调用方法,设置属性和激发事件
1. 包括方法、属性、事件、字段及构造函数,还可以获得每个成员的名称、限定符和参数等信息。
2.利用反射可以在运行时根据得到的类型信息动态创建类型的实例,设置字段,调用方法,设置属性和激发事件
现在我把有关反射类所设计的一些知识给大家共享出来,如果你想获得更好的理解,建议你通过msil去查看一下这些类到底再内存中是如果工作的,
所有我们现在用的反射都是通过抽象类来引用自己派生类的东西,所有有关对类进行操作的反射类的方法,微软已经全部封装在.dll程序集中是internel类型的,因此我们是直接用不了的
现在我把我们老师的内容给大家发布出来,希望对你们有用
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//(1).NET Framework对RTTI提供了整套支持,最重要的一个支持就是System.Type类。
// CLR开始在一个进程中运行时,它会立即为System.Type类型(在MSCorLib.dll中定义)创建一个特殊的类型对象System.RuntimeType
// 其它运行类型对象均为System.RuntimeType类型的实例。
// CLR开始在一个进程中运行时,它会立即为System.Type类型(在MSCorLib.dll中定义)创建一个特殊的类型对象System.RuntimeType
// 其它运行类型对象均为System.RuntimeType类型的实例。
//(2)在运行其间,可以通过以下方法返回System.Type类型的实例。
// (a)Object.GetType()方法是非虚方法,这样可以防止一个类重写该方法,并隐藏其类型,从而破坏类型安全性。
// Object.GetType() 返回当前实例的运行时类型,更详细的说:
// Object.GetType()返回的是存储在指定对象中的“类型对象指针”成员中的地址,
// 即返回的是指定对象的类型对象指针。
// Object.GetType() 返回当前实例的运行时类型,更详细的说:
// Object.GetType()返回的是存储在指定对象中的“类型对象指针”成员中的地址,
// 即返回的是指定对象的类型对象指针。
// (b)typeof 运算符用于获得指定类型的 System.Type对象,即返回的是指定类型的类型对象指针。
// typeof 表达式采用的形式:typeof(type)
// 其中:type 要获得其 System.Type 对象的类型。
// typeof 表达式采用的形式:typeof(type)
// 其中:type 要获得其 System.Type 对象的类型。
// (c)通过System.Type类的静态方法创建
// 传入的自符串参数必须是完全限定名:
// Type myType1 = Type.GetType("System.Int32");
// 传入的自符串参数必须是完全限定名:
// Type myType1 = Type.GetType("System.Int32");
// (d)通过System.Reflection.Assembly类的实例方法
// System.Reflection.Assembly.GetType(<args>)
// System.Reflection.Assembly.GetTypes()
//
// System.Reflection.Assembly.GetType(<args>)
// System.Reflection.Assembly.GetTypes()
//
using System;
using System.Reflection;
namespace _08_21
{
public class Class_08_21
{
public static void Main()
{
//因为System.Type类型对象本身也是System.RuntimeType类型对象的“实例”。
// 获取 System.Type 自身的 Type 实例
Type t = typeof(System.Type);
{
public class Class_08_21
{
public static void Main()
{
//因为System.Type类型对象本身也是System.RuntimeType类型对象的“实例”。
// 获取 System.Type 自身的 Type 实例
Type t = typeof(System.Type);
//System.RuntimeType类型对象本身也是一个对象,所以也包含一个类型对象指针成员,它指向它本身。
Type t1 = t.GetType();
Type t2 = t1.GetType();
Type t1 = t.GetType();
Type t2 = t1.GetType();
Console.WriteLine(t);
Console.WriteLine(t1);
Console.WriteLine(t2);
// 获取一些该 Type 的性质
Console.WriteLine("IsAbstract : {0}", t.IsAbstract);
//Console.WriteLine("IsAbstract : {0}", t.GetType().IsAbstract);
Console.WriteLine("IsClass : {0}", t.IsClass);
Console.WriteLine("IsArray : {0}", t.IsArray);
Console.WriteLine("IsValueType : {0}", t.IsValueType);
Console.WriteLine("IsPublic : {0}", t.IsPublic);
// 获取该 Type 的公共字段
Console.WriteLine("Type 的 Fields :");
foreach (FieldInfo fi in t.GetFields())
{
Console.WriteLine("\t{0}", fi);
}
Console.WriteLine("Type 的 Fields :");
foreach (FieldInfo fi in t.GetFields())
{
Console.WriteLine("\t{0}", fi);
}
Console.WriteLine("RuntimeType 的 Fields :");
foreach (FieldInfo fi in t1.GetFields())
{
Console.WriteLine("\t{0}", fi);
}
foreach (FieldInfo fi in t1.GetFields())
{
Console.WriteLine("\t{0}", fi);
}
// 用 GetMethod(string, Type[]) 方法获取该方法本身的信息
Console.WriteLine("GetMethod : {0}", t.GetMethod("GetMethod", new Type[] { typeof(string), typeof(Type[]) }));
Console.WriteLine("GetMethod : {0}", t.GetMethod("GetMethod", new Type[] { typeof(string), typeof(Type[]) }));
}
}
}
}
}