一、什么是反射?

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

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

二、怎么实现?

  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. linux篇-linux下zabbix安装

    1本人用的是apache+mysql+php 2下载zabbix软件包,官网下载 https://sourceforge.net/projects/zabbix/files/ZABBIX Latest ...

  2. 个人冲刺(三)——体温上报app(二阶段)

    冲刺任务:完成用户类.温度数据和第二页面类的编写 User.java package com.example.helloworld; class User { private String usern ...

  3. IntelliJ IDEA中如何优雅的调试Java Stream操作

    Stream操作是Java 8推出的一大亮点!虽然java.util.stream很强大,但依然还是有很多开发者在实际工作中很少使用,其中吐槽最多的一个原因就是不好调试,一开始确实是这样,因为stre ...

  4. Java基础(1)——ThreadLocal

    1. Java基础(1)--ThreadLocal 1.1. ThreadLocal ThreadLocal是一个泛型类,当我们在一个类中声明一个字段:private ThreadLocal<F ...

  5. 深度学习与CV教程(2) | 图像分类与机器学习基础

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...

  6. 《Effective C++》阅读总结(三):资源管理

    C++中的资源管理非常重要,在将资源加载到内存后,便可以使用资源了,当我们不再需要资源时,我们要保证其正确的释放,才能将其占用的内存空间归还给操作系统,不正确的释放很容易造成内存泄漏.本章以资源管理类 ...

  7. drools决策表的简单使用

    目录 一.背景 二.一个简单的决策表 1.在同一个决策表中处理多个Sheet页 2.RuleSet下方可以有哪些属性 3.RuleTable下方可以有哪些属性 4.规则属性的编写 三.需求 四.实现 ...

  8. R数据分析:临床预测模型中校准曲线和DCA曲线的意义与做法

    之前给大家写过一个临床预测模型:R数据分析:跟随top期刊手把手教你做一个临床预测模型,里面其实都是比较基础的模型判别能力discrimination的一些指标,那么今天就再进一步,给大家分享一些和临 ...

  9. 设置C#启动进程但不显示命令行窗口

    设置一下Process类型相关的配置属性即可,直接上代码. //记得引入命名空间 //using System.Diagnostics; //获得当前环境的基路径 string basePath = ...

  10. tensorflow版本的bert模型 GPU的占用率为100%而其利用率为0%

    Notice: 本方法只是解决问题的一种可能,不一定百分百适用,出现这个问题还有很多其他原因,这个可以作为解决的一种尝试!!! 经过检查发现,是由于激活环境的原因 使用 conda activate ...