C#反射浅析

摘要:
首先,了解C#反射的概念,这是一个运行时类型发现的过程。C#反射命名空间:1.系统反射命名空间中的每种类型的程序集都可以用于加载、理解和操作程序集AssemblyName。通过它,您可以找到隐藏在程序集标识中的许多信息,例如版本信息、区域信息和其他有关EventInfo事件的信息。有关FieldInfo字段的信息。有关MethodInfo方法的信息。有关ParameterInfo参数的信息。有关PropertyInfo属性的信息。MemberInfo是一个抽象基类,它是EventInfo,FieldInfo类型(如MethodInfo和PropertyInfo)定义公共行为。

首先了解C#反射的概念,反射是一个运行库类型发现的过程。通过反射可以得到一个给定程序集所包含的所有类型的列表,
   
    这个列表包括给定类型中定义的方法、字段、属性和事件。也可以动态的发现一组给定类支持的借口、方法的参数和其他
   
    相关信息如基类、命名空间、数据清单等。
   
    C#反射命名空间详细介绍:
   
    1.System.Reflection命名空间内的各类型
   
    (1) Assembly通过它可以加载、了解和操纵一个程序集
   
    (2) AssemblyName 通过它可以找到大量隐藏在程序集的身份中的信息,如版本信息、区域信息等
   
    (3) EventInfo 事件的信息
   
    (4) FieldInfo 字段的信息
   
    (5) MethodInfo 方法的信息
   
    (6) ParameterInfo 参数的信息
   
    (7) PropertyInfo 属性的信息
   
    (8) MemberInfo 是抽象基类,为 EventInfo、FieldInfo 、MethodInfo、PropertyInfo等类型定义了公共的行为。
   
    (9) Module 用来访问带有多文件程序集的给定模块
   
    2.System.Type类
   
    System.Type支持的成员可以分为这样几类
   
    (1) Is*** 用来检查一个类型的元数据,如IsAbstract、IsClass、IsValueType等等
   
    (2) Get*** 用来从类型得到指定项目,如GetEvent()得到类型的一个指定的事件(EventInfo)。
   
    另外,这些方法都有一个单数版本和一个复数版本。如GetEvent()对应有一个复数版本GetEvents(),
   
    该方法返回一个相关的EventInfo数组。
   
    (3) FindMembers() 根据查询条件返回一个MemberInfo类型的数组
   
    (4)GetType() 该静态方法根据一个字符串名称返回一个Type实例
   
    (5)InvokeMember() 对给定项目进行晚期绑定
   
    3.得到一个Type类型实例的三种方法
   
    因为Type是一个抽象类,所以不能直接使用new关键字创建一个Type对象
   
    (1)使用System.Object.GetType()
   
    Person pe=new Person(); //---------定义pe为person类的一个对象
   
    Type t=pe.GetType();
   
    (2)使用System.Type.GetType()静态方法,参数为类型的完全限定名
   
    Type t=Type.GetType("Entity.Person"); 该方法被重载,允许指定两个布尔类型的参数,一个用来控制当前类型不能找到时是否抛出异常,
   
    另一个用来指示是否区分字符串大小写
   
    Type t=Type.GetType("Entity.Person",false,true); 注意到传入的字符串并没有包含类型所在的程序集信息,此时该类型便被认为是定义在当前执行的程序集中的。
   
    要得到一个外部私有程序集的类型元数据时,字符串参数必须使用类型完全限定名加上类型所在程序集的友好名字
   
    Type t=Type.GetType("Entity.Person","Entity"); //------"Entity"即为类型所在程序集的友好名字 嵌套类型:传入的字符串可以指定一个+标记来表示一个嵌套类型,
   
    如希望得到一个嵌套在person类中的枚举类型City的类型信息,则可以这样
   
    Type t=Type.GetType("Entity.person+City");
   
    (3)使用typeof运算符
   
    Type t=typeof(person); 三种方法的比较:
   
    使用第一种方法必须先建立一个实例,而后两种方法不必先建立实例。但使用typeof运算符仍然需要知道类型的编译时信息,
   
    而使用System.Type.GetType()静态方法不需要知道类型的编译时信息,所以是首选方法。
   
    一个最简单的C#反射实例,首先编写类库如下:
   
    namespace ReflectionTest
   
    {
   
    public class WriteTest
   
    {
   
    //带参数的公共方法
   
    public void WriteString(string s, int i)
   
    {
   
    Console.WriteLine("WriteString:" + s + i.ToString());
   
    }
   
    //带一个参数的静态方法
   
    public static void StaticWriteString(string s)
   
    {
   
    Console.WriteLine("StaticWriteString:" + s);
   
    }
//不带参数的静态方法
   
    public static void NoneParaWriteString()
   
    {
   
    Console.WriteLine("NoParaWriteString");
   
    }
   
    }
   
    }
   
    class TestApp
   
    {
   
    public static void Main()
   
    {
   
    Assembly ass;
   
    Type type;
   
    Object obj;
   
    //用来测试静态方法
   
    Object any = new Object();
   
    //指定类库文件必须使用绝对路径,不能使用相对路径
   
    ass = Assembly.LoadFile(@"D:Source Code

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇〖Linux〗noip免费域名申请,及更新域名的API【C#】使用OWIN创建Web API下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

WebStorm好用的插件推荐

随着时间的推移,编写JavaScript代码很多有用的插件都集成了WebStorm中,在WebStorm中即使不装任何插件,都能很舒服的进行开发网页应用、Node应用。插件对于WebStorm并不是特别的重要,但是某些插件实在是比较好用,所以本篇文章就整理一下比较好用的插件。使用该插件,可以直接在WebStorm中内嵌一个翻译界面。...

vant-picker二次封装

痛点在项目经常会遇到这样的设计,下拉选择框,在vant中没有提供直接的select组件,但是可以使用Field、Popup和Picker这三个组件组合来完成。this.show;}},watch:{selectValue:function{this.result=newVal;},result{this.$emit;}}};效果链接:https://www....

微信小程序----返回上一页刷新或当前页刷新

1.Reload()方法刷新当前页面;2.replace()方法刷新当前页面;3.页面自动刷新当前页面;实现js刷新当前页面的三种方法使用微信小程序--返回上一页刷新或当前页面刷新1.在实现效果之前,您需要了解微信小应用程序的页面生命周期。如果你不太清楚,你可以看到微信小程序——页面生命周期;2.我们可以知道微信小程序页面由五个循环组成:onLoad、onR...

更改nexus的工作目录

默认情况下,nexus的工作目录位于${user_home}/sonatype工作目录中。在Linux中,如果用户是root用户,则使用/root/sonatype。这便于通过war将nexus安装到servlet容器中,但不利于服务器的集中管理。这需要更改默认的nexus工作目录位置。为了方便管理,您可以选择使用环境变量。...

(二)Jenkins配置主从节点实例

4.从节点配置和相关配置中从节点机创建jenkins用户,并从一些环境配置中创建jenkings用户的ssh密钥,用于指定上述配置界面的ssh启动模式;在配置启动模式和项目源代码管理中从远程仓库获取源代码;创建Jenkins用户并使用root登录到远程子节点计算机。#adduserjenkins#passwdjenkins生成Jenkins用户的ssh密钥。...

差分方程的零输入响应与零状态响应

差分方程的迭代分析方法有以下缺点:没有闭合解,不利于数学分析。某个时间的输出只能从头开始计算。本文介绍了差分方程的零输入响应和零状态响应分析方法。对于系统,这种分析方法可以很好地表达系统响应的物理意义=Y[-1]=0$Input Y[n]。回顾零输入响应和零状态响应的迭代计算,我们发现以下规则:$egin{align*}y[0]&=-&qqu...