c#反射

在学习的时候学到反射这块,先简单的小结一下:


1.什么是反射

反射就是一个普通的术语,它描述了在运行过程中检查和处理程序元素的功能。.net的应用程序主要由程序集,模块,类型组成,而反射就是提供一种方式,让程序员能够获取相关的信息。

反射主要的功能:

枚举类型的成员

实例化新对象

执行对象的成员

查找类型的信息

查找程序集的信息

检查应用于某种类型的自定义特性

创建和编译新的程序集

2.自定义特性

自定义特性允许将自定义元数据与程序元素关联起来。

编译器遇到代码中应用了自定义特性的元素时,该如何处理,以写csv文件为例,如下所示:

[FieldName("SerialNumber")]
public string SerialNumber
{
      get{
            //etc.
}

c#编译器发现该属性(property)应用了FieldName属性时,就首先会把字符串Attribute追加到这个名称的后面,形成组合名称FieldNameAttribute,然后再其搜索路径的所有的命名空间中搜索指定名称的类,如果该特性的名称是以Attribute结尾,则系统不会再追加字符串Attribute。

编译器会找到含有该名称的类,且这个类直接或间接派生自System.Attribute,如下所示

[AttributeUsage(AttributeTargets.Property)]
public class FieldNameAttribute :  Attribute
{
    private string serialNumber;
    public FieldNameAttribute(string serialNumber)
    {
         this.serialNumber = serialNumber;
    }
}

    AttributeUsage: 特性类需要使用该特性来 标记。

AttributeTragets: 设置该特性应用于哪些类型,这边应用于属性上,当然还有其他类型,如方法,类等等

当编译器找到上面的类之后,会检查传给特性类的参数“SerialNumber”,根据该参数,会检查上面的特性类中是否有相对应的构造函数,如果没有。则会生成编译错误,如果有,则编译器会实例化指定的特性。


3. System.Type类

通过这个类,可以访问关于任何数据类型的信息,包括上面的自定义特性。

如: Type t = typeof(double)   这个只是为了存储类型的引用

double d = 10; Type t = d.GetType()则可以获取d的类型信息。

Type是许多反射功能的入口,它实现了很多方法和属性,且可用的属性都应该是只读的,可以使用Type确定数据的类型,但是不能使用它修改类型。

Type属性: 

数据类型名Name

数据类型的完全限定名 FullName

数据类型所在的名称空间名NameSpace

Type方法:大多数用于获取对应数据类型的成员信息,如 GetMethod()获取类型中的方法, GetProperty()获取类型中的属性等等。

GetMembers()则获取数据类型的所有成员的详细信息。


4. Assembly类

在使用Assembly实例前,需要把相应的程序集加载到正在运行的进程中:

Assembly assembly1 = Assembly.Load("...");  直接传入程序集的名字

Assembly assembly2 = Assembly.LoadFrom("...");传入程序集完整的路径名

Assembly的一个功能就是获得相应程序集中定义的所有的类型的详细信息,只要调用Assembly.GetTypes(),

就可以返回一个包含所有类型的详细信息的System.Type的引用数组。

获取自定义类型的详细信息:

Attribute[] attributes = Attribute.GetCustomAttributes(assembly1) 能够获取程序集assembly1中的所有的特性。


5. 应用:

由上面的一些基本知识,可以知道一些简单的反射的用法,下面以创建csv文件为例简单的描述下:

对于csv文件,需要先设置头,也就是每一项有1个标题,每一项的标题将会作为该列的数据的描述,同时对于每一列的数据,有时会有格式要求。这样我们就可以

将标题:FiledName和格式Format作为自定义的一个特性赋给每一列的数据。这样向csv文件中添加数据的时候,只需要使用typeof(T),T是一个类,每一条属性对应着

一个特性。使用typeof(T).GetPropertis()来获取所有的属性值来向csv文件中添加数据,同时使用property.GetCustomerAttributes(...)的方法来获取属性的特性,根据

获得的特性来设置csv文件的头,以及每条数据的格式。

关于Assembly类的使用,也举个简单例子:加载程序集之后,我们通过获取指定的特性来判断该程序集是否有指定的特性: Attribute supportAttribute =Attribute.GetCustomerAttribute( Assembly1, typeof(指定的特性名字), 如果返回null,则说明该程序集不支持该特性。如果不为null,则可进行下一步操作

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值