一、什么是反射?

  了解反射之前我们必须知道一个概念——元数据。有关程序和程序类型的信息叫做元数据,通俗的解释就是类里面的方法、属性、字段等。

而程序在运行的时候去查看其它程序集的行为就叫做反射。在我们不知道类的内部情况时,反射可以让我们获取类里所有的方法、属性等。

二、怎么实现?

  c#的基础类库声明了一个叫做Type的类,我们通过创建Type类的实例来调用Type,Type中包含了类型信息。我们可以通过GetType方法跟typeof方法来获取对象。

  下面说一下两者的使用方法;

 Type t = item.GetType();            //在不知道Type类型内部的情况下,一般使用GetType方法来获取对象

Type t = typeof(Myclass);            //在使用typeof()方法之前我们需要获取类型名

//几种常用的方法
FieldInfo[] f = t.GetFields();      //GetField()方法获取t中的所以字段并放入数组f中

object[] o = t.GetMethods();        //GetMethods()方法获取t中的方法

三、反射注意事项

  1、一定要记得加上System.Reflection命名空间。

  2、获取方法的时候一定得是object类型,因为方法的返回值不一样,只能用objec接收。

四、什么是特性?

  特性可以看做是一种特殊的类,他允许我们向程序集中添加元数据。例如Myclass类应用了特性,那么它就叫做目标,而它的子类或者是type类获取Myclass里面的

元数据,那么它们就被称之为消费者。

五、特性应用

  .NET.预定了很多特性,我们也可以自己声明自定义特性。

[Obsolete("多捞哦", true)]              //Obsolete是预定的特性:过时,表示已弃用,若不加true,方法可以运行,但是会警告,加了true就无法运行,系统会报错
static void Show()
{
Console.WriteLine("运行成功");
} [AttributeUsage(AttributeTargets.Class)]      //这个是自定义特性
public sealed class ReviewCommentAttribute : System.Attribute
{
public string Description { get; set; }
public string VersionNumber { get; set; }
public string ReviewerID { get; set; }
public ReviewCommentAttribute(string desc, string ver)
{
Description = desc;
VersionNumber = ver;
}
}
[ReviewComment("Check it out","2.4")]    //这里是调用前面的特征类,可以省略后缀Attribute
class MyClass { }

  Type类提供的两种访问特性的方法IsDefined 和 GetCustomAttributes 经常使用。

//IsDefined函数需要两个参数,返回值为bool类型
bool isdefined = t.IsDefined(typeof(ReviewCommentAttribute), false);
//GetCustomAttributes返回为object类型
object[] AttArr = t2.GetCustomAttributes(false);

//用as强转为MyAttributeAttribute类型
MyAttributeAttribute attr = item as MyAttributeAttribute;

  特性本身可以看做是一个类,有个预定义特性可以用在自定义特性上来限制自定义特性:AttributeUsage

[AttributeUsage(AttributeTargets.Class)]   //针对Class 类,还可以是Method 方法,Proprietary 属性等

C#反射跟特性的更多相关文章

  1. .NET基础拾遗(4)委托、事件、反射与特性

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

  2. 十七、C# 反射、特性和动态编程

    反射.特性和动态编程   1.访问元数据 2.成员调用 3.泛型上的反射 4.自定义特性 5.特性构造器 6.具名参数 7.预定义特性 8.动态编程   特性(attribute)是在一个程序集中插入 ...

  3. 利用反射的特性将DataReader对象转化为List集合

    问题:将SqlDataReader对象转换为List<T>集合 思路: 1,利用反射的特性得到对应实体Model的公共属性 Type type = typeof(T); PropertyI ...

  4. C#图解教程 第二十四章 反射和特性

    反射和特性 元数据和反射Type 类获取Type对象什么是特性应用特性预定义的保留的特性 Obsolete(废弃)特性Conditional特性调用者信息特性DebuggerStepThrough 特 ...

  5. C#反射与特性使用简介

    本文是学习特性与反射的学习笔记,在介绍完特性和反射之后,会使用特性与反射实现一个简单的将DataTable转换为List的功能,水平有限,如有错误,还请大神不吝赐教. 1.      反射:什么是反射 ...

  6. .NET技术-1.0.使用反射、特性简化代码(验证Model类)

    使用反射.特性简化代码 参考项目:利用反射验证Model类/AssemblyVerification 假设现在有一个学生类(Student) /// <summary> /// 学生类 / ...

  7. C#根据反射和特性实现ORM映射实例分析

    本文实例讲述了C#根据反射和特性实现ORM 映射的方法.分享给大家供大家参考.具体如下: (一)关于反射 什么是反射? 反射就是在运行时,动态获取对象信息的方法.比如:运行时获得对象有哪些属性,方法, ...

  8. C#反射与特性(一):反射基础

    目录 C#反射与特性(一):反射基础 1. 说明 1.1 关于反射.特性 2. 程序集操作 2.1 获取 程序集对象(Assembly) 2.2 Assembly 使用 2.3 获取程序集的方式 C# ...

  9. C#反射与特性(五):类型成员操作

    目录 1,MemberInfo 1.1 练习-获取类型的成员以及输出信息 1.2 MemberType 枚举 1.3 MemberInfo 获取成员方法并且调用 1.4 获取继承中方法的信息(Decl ...

  10. C#反射与特性(六):设计一个仿ASP.NETCore依赖注入Web

    目录 1,编写依赖注入框架 1.1 路由索引 1.2 依赖实例化 1.3 实例化类型.依赖注入.调用方法 2,编写控制器和参数类型 2.1 编写类型 2.2 实现控制器 3,实现低配山寨 ASP.NE ...

随机推荐

  1. Spring 源码(16)Spring Bean的创建过程(7)属性填充

    知识回顾 上一篇介绍了Spring中三级缓存的singletonObjects.earlySingletonObjects.singletonFactories,Spring在处理循环依赖时在实例化后 ...

  2. ML第7周学习小结

    本周收获 总结一下本周学习内容: 1.学习了<深入浅出Pandas>的第六章:Pandas分组聚合 6.4 聚合统计 6.5 数据分箱 6.6 分组可视化 博客: pandas:聚合统计. ...

  3. torch.nn.MSELoss()函数解读

    转载自:https://www.cnblogs.com/tingtin/p/13902325.html

  4. 【C++函数题目】重载完成Compare函数

    题目来源链接:https://www.dotcpp.com/oj/problem2008.html 题目讲解链接:http://6o2.cn/1yjJB2  题目描述 利用函数重载完成三个比较大小的C ...

  5. ubuntu使用postfix和AWS-SES发送邮件

    在日常开发中,邮件发送是个比较常见的场景.因此出现了很多相关的软件和服务,各大云厂商也推出自己的邮件服务.今天笔者就像大家介绍一种常见的组合,AWS的邮件服务 SES 与邮件服务器 postfix 的 ...

  6. 第一章:Python的数据结构、函数和文件

    list list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: >>> classmates = ['Michael', ...

  7. python小题目练习(四)

    题目:JAVA和Python实现冒泡排序 实现代码: # Java实现对数组中的数字进行冒泡排序scoreList = [98, 87, 89, 90, 69, 50]temp = 0for i in ...

  8. 从区划边界geojson中查询经纬度坐标对应的省市区县乡镇名称,开源Java工具,内存占用低、高性能

    目录 坐标边界查询工具:AreaCity-Query-Geometry 性能测试数据 测试一:Init_StoreInWkbsFile 内存占用很低(性能受IO限制) 测试二:Init_StoreIn ...

  9. IDEA快速创建maven项目

    遇到问题不要急,不要怕. 一.  二. 三.  四.Finish进来之后,项目会加载一会,之后会是下面这样子.  五.继续往下面配置,建立java和resorces文件夹  六.下面配置tomcat服 ...

  10. 项目: ATM+购物车

    ATM+购物车 项目文件: 介绍 以下为文件夹层次和内容: readme.md 1. 需求 模拟银行取款 + 购物全过程 1.注册 2.登录 3.提现 4.还款 5.转账 6.查看余额 7.查看购物车 ...