C# 反射
Posted 安以痕_陈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C# 反射相关的知识,希望对你有一定的参考价值。
刚工作没多久,需要对以往的知识进行复习和巩固。先讲讲最近在公司常用到的反射机制。
反射(Reflection):提供了封装程序集、模块和类型的对象(Type 类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。
反射用到的命名空间:
System.Reflection
反射用到的主要类:
System.Type 类--通过这个类可以访问任何给定数据类型的信息。
System.Reflection.Assembly类--它可以用于访问给定程序集的信息,或者把这个程序集加载到程序中。
反射一般运用于3种情况
1,基于System.Type的反射;2,对方法,属性等的反射;3,动态加载以及推迟绑定。
一,基于System.Type的反射
注:Type 类是反射类的核心。Type 封装了对象类型的表示。Type 类是访问元数据的主要手段。
例1,
static void Main(string[] args)
{
string s1 = "Hello Reflection!";
int s2 = 888;
Type t1 = s1.GetType();//获取s1的类型
Type t2 = s2.GetType();
Console.WriteLine(t1.FullName);// 获取t1的完全限定名
Console.WriteLine(t2);// 有时候,t1.Fullname 与 t1 的运行效果是一样的,但下面就有本质的区别。
}
例 2,
static void Main(string[] args)
{
Type t3 = Type.GetType("System.String", false, true); //获取指定名称的 System.Type ,bool 型 - 是否抛出异常(false:找不到指定类型不抛出异常),
// bool 型 - 是否忽视区分大小写(true: 不区分大小写)
Type t4 = Type.GetType("System.Strgging", false, true);
Console.WriteLine(t3);
Console.WriteLine("-----------");
Console.WriteLine(t4);
Console.WriteLine("-----------");
}
注意啦,例1上的 t1 与 t1.FullName 区别来啦
将例2的 Console.WriteLine(t4) ; 改为 Console.WriteLine(t4.FullName); 查看运行结果。
bug 来了!!!此处异常是在
执行 Console.WriteLine(t4.FullName);时发生的。与上面 Type t4 = Type.GetType("System.Strgging", false, true); 的 bool false 的不抛出异常无关。
例3,
用 typeof 关键字 获取类型 与 GetType() 又不一样啦。
typeof(string)//直接填写其类型即可
static void Main(string[] args)
{
Type t5 = typeof(string);
Type t6 = typeof(string2222);
Console.WriteLine(t5);
Console.WriteLine(t6);
}
// 这里面t5.FullName 与 t5 运行效果是一样的。 但是当所输入的类型不存在,即使你是 t6 不是 t6.FullName 也会抛异常的,不会显示为空。
Type仍有许多用途,具体的查看一些相关书籍,先讲一些小例题,让大家熟悉一下反射的浅显内容,在 C#反射(二)在讲解 2,对方法,属性等的反射。
以上是关于C# 反射的主要内容,如果未能解决你的问题,请参考以下文章
Unity C# 游戏开发 反射 Reflection 案例讲解(图文详细,带源码)
Swift - 反射(Reflection)的介绍与使用样例(附KVC介绍)