1. 概述反射

  • 通过反射可以提供类型信息,从而使得我们开发人员在运行时能够利用这些信息构造和使用对象。
  • 反射机制允许程序在执行过程中动态地添加各种功能。

  2. Type类的介绍 

  • 是BCL(基底类别库)声明的一个抽象类,所有它不能被实例化
  • 对于程序中用到的每一个类型,CLR(公共语言运行时)都会创建一个包含这个类型信息的Type类型的对象
  • 程序中用到的每一个类型都会关联到独立的Type类型的对象
  • 不管创建的类型有多少个实例,只有一个Type对象会关联到所有这些实例

    2.1 Type类的部分常见成员

    成员 成员类型 描述
    Name 属性 返回类型的名字
    FullName 属性 返回数据类型的完全限定名(包括命名空间名)
    NameSpace 属性 返回包含数据类型声明的命名空间
    Assembly 属性 返回声明类型的程序集。如果类型是泛型的,返回定义这个类型的程序集
    GetConstructor(), GetConstructors() 方法 返回ConstructorInfo类型,用于取得该类的构造函数的信息
    GetEvent(), GetEvents() 方法 返回EventInfo类型,用于取得该类的事件的信息
    GetField(), GetFields() 方法 返回FieldInfo类型,用于取得该类的字段(成员变量)的信息
    GetInterface(), GetInterfaces() 方法 返回InterfaceInfo类型,用于取得该类实现的接口的信息
    GetMember(), GetMembers() 方法 返回MemberInfo类型,用于取得该类的所有成员的信息
    GetMethod(), GetMethods() 方法 返回MethodInfo类型,用于取得该类的方法的信息
    GetProperty(), GetProperties() 方法 返回PropertyInfo类型,用于取得该类的属性的信息

  3. 如何获取Type类型

   3.1GetType()和typeof() 方法 两者都是返回Syetem.Type的引用。(private和protected修饰的成员也可以访问到)

       3.1.1 GetType()

              1.GetType()是从Syetem.object中基础的方法。

2.GetType()必须要通过类型的实例点出这个方法。

       3.1.2 typeof()

              1.typeof(xx)是公开的运算符。

2.typeof(xx)中xx只能是int,string 等类型及自定义类型,不能是实例。

3.2 不同点

            1.GetType()返回的是Type(类型)

2.typeof(xx) 返回的是xx Class(类)的类型

  //实例一个用户类
User user = new User();
//GetType()方法
Type getType = user.GetType();
//typeof(xx) 方法
Type typeOf = typeof(User);
//判断是否相等
if (getType == typeOf)
{
//这里相等
Console.WriteLine("我在这");
}

 4.Type类方法        

1: 一旦有了Type对象就可以使用GetMethodInfo()方法获取此类型支持的方法列表。该方法返回一个MethodInfo 对象数组,MethodInfo对象描述了主调类型所支持的方法,他位于System.Reflection命名空间中

2: MethodInfo类派生于MethodBase抽象类,而MethodBase类继承了MemberInfo类。因此我们能够使用这三个类定义的属性和方法。例如,使用Name属性得到方法名称。这里有两个重要的成员:

3: ReturnType属性 :为Type类型的对象,能够提供方法的返回类型信息 GetParameters()方法 :返回参数列表,参数信息以数组形式保存在PatameterInfo对象中。PatameterInfo类定义了大量描述参数信息的属性和方法。这里也列出两个常用的属性 :Name(包含参数名称信息的字符串),ParameterType(参数类型的信息)。

//创建实例
Sublevel sublevel = new Sublevel();
//获取类型
Type sublevelType = sublevel.GetType();
//获取类型的方法列表
//BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public 这个有一个注意点
//实际上至少要有Instance(或Static)与Public(或NonPublic)标记。否则将不会获取任何方法。
MethodInfo[] obj = sublevelType.GetMethods(BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public);
//遍历所有的方法
foreach (MethodInfo item in obj)
{
//返回方法的返回类型
Console.Write(item.ReturnType.Name);
//返回方法的名称
Console.Write(" "+item.Name+"(");
//获取方法的返回参数列表
ParameterInfo[] parameterss = item.GetParameters();
foreach (var parameters in parameterss)
{
//参数类型名称
Console.Write(parameters.ParameterType.Name);
//参数名称
Console.Write(" "+parameters.Name+",");
}
Console.WriteLine(")");
}

执行的结果,获取了所有的方法,包括了方法的方法名称,方法的返回类型,方法参数列表。

5.方法的使用

前面我们讲了放的显示,但是只能看到不能用就不好了呀!!!

5.1:GetMethods()方法的另一种形式

这种形式可以制定各种标记,已筛选想要获取的方法。他的通用形式为:MethodInfo[] GetMethods(BindingFlags bindingAttr)BindingFlags是一个枚举,枚举值有(很多只列出4个吧)

  1. Instance:获取实例方法
  2. NonPublic: 获取非公有方法
  3. Public: 获取共有方法
  4. Static:获取静态方法

GetMethods(BindingFlags bindingAttr)这个方法,参数可以使用or把两个或更多标记连接在一起,实际上至少要有Instance(或Static)与Public(或NonPublic)标记。否则将不会获取任何方法。del.GetType();

public static void Method<T>(T model) {
//获取泛性的Type类型
Type objType = model.GetType();
//获取泛性的方法列表
MethodInfo[] mthodInfos = objType.GetMethods();
//循环方法
foreach (var item in mthodInfos)
{
//获取方法的所有参数列表
var parameters = item.GetParameters();
//过滤没用方法
//1:查看是不是有参数的方法
//2:查看这个方法的返回类型是不是我们想要的
//3:查看这个方法的返回类型是不是我们想要的
if (parameters.Any() &&
parameters[].ParameterType == typeof(int) &&
item.ReturnType != typeof(void))
{
//调用方法
object[] parametersObj = new object[] { };
//调用实例方法
//第一个参数是我们的实体,后面是我们的参数(参数是一个数组,多个参数按照顺序来传递,没有参数可以为null)
//如果我们的方法是一个静态方法 ,这个参数可以为null (不是静态的就会报错)
Console.WriteLine(item.Invoke(model, parametersObj));
}
}
}

6.DataTable转Model(List)

   在刚刚学.net 的时候,我们从数据库查询出一个DataTable的时候想要转成Model或者LIst的时候我们需要手动的写遍历,超级麻烦(在没有接触MVC的时候我就是)

 /// <summary>
/// DataTable转换
/// </summary>
public class TransitionDataTable
{
/// <summary>
/// DataTable转换模型
/// </summary>
/// <typeparam name="T">模型类型</typeparam>
/// <param name="obj">模型</param>
/// <param name="data">数据行</param>
/// <returns></returns>
public T DataSetBindModel<T>(T obj, DataTable data) where T : class, new()
{
T result = new T();
foreach (DataRow item in data.Rows)
{
result = assignmentClass(obj, item);
}
return result;
} /// <summary>
/// DataTable转换List
/// </summary>
/// <typeparam name="T">模型类型</typeparam>
/// <param name="obj">模型</param>
/// <param name="data">数据行</param>
/// <returns></returns>
public List<T> DataSetBindList<T>(T obj, DataTable data) where T : class, new()
{
List<T> result = new List<T>();
foreach (DataRow item in data.Rows)
{
result.Add(assignmentClass(obj, item));
}
return result;
} /// <summary>
/// DataRow 转换成模型
/// </summary>
/// <typeparam name="T">模型类型</typeparam>
/// <param name="obj">模型</param>
/// <param name="row">数据行</param>
/// <returns></returns>
private T assignmentClass<T>(T obj, DataRow row) where T : class, new()
{
if (obj == null)
{
obj = new T();
}
Type type = obj.GetType();
//得到类型的所有属性,也就是表对应的实体模型的所有属性
//嗮选一下只要公开的
PropertyInfo[] properts = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
if (properts.Any())
{
foreach (PropertyInfo item in properts)
{
if (row.Table.Columns.IndexOf(item.Name) != -)
{
if (row[item.Name] != null && row[item.Name] != DBNull.Value)
{
item.SetValue(obj, row[item.Name]);
}
}
}
}
return obj;
}
}

调用

static void Show()
{
DataTable data = new BDHelper().GetData("select * from Jack_News_TNews");
News news = new News();
var list = new TransitionDataTable().DataSetBindList(news, data);
}

.net core 反射的介绍与使用的更多相关文章

  1. Core Foundation框架介绍

    Core Foundation框架介绍 **参考网址: ARC下OC对象和CF对象之间的桥接 Core Foundation框架介绍 Core Foundation框架 Core Foundation ...

  2. Core文件简单介绍及生成设置方法

    Core文件简单介绍及生成设置方法 Core文件其实就是内存的映像,当程序崩溃时,存储内存的相应信息,主用用于对程序进行调试.当程序崩溃时便会产生core文件,其实准确的应该说是core dump 文 ...

  3. Java反射详细介绍

    反射 目录介绍 1.反射概述 1.1 反射概述 1.2 获取class文件对象的三种方式 1.3 反射常用的方法介绍 1.4 反射的定义 1.5 反射的组成 1.6 反射的作用有哪些 2.反射的相关使 ...

  4. .NET Core 反射获取所有控制器及方法上特定标签

    .NET Core 反射获取所有控制器及方法上特定标签 有个需求,就是在. NET Core中,我们想在项目 启动时,获取LinCmsAuthorizeAttribute这个特性标签所有出现的地方,把 ...

  5. .net core的配置介绍(一):IConfiguration

    说到配置,绝大部分系统都会有配置,不需要配置的系统是非常少的,想想以前做.net 开发时,我们常常将配置放到web.config中,然后使用ConfigurationManager去读取. 初次接触到 ...

  6. .Net Core 之 MSBuild 介绍

    前言 关于 .NET Core 旧版本的 sdk 介绍可以参看我以前的 这篇 文章. 8 个小时前,.NET Core 项目组释放了 .NET Core 新一轮的 sdk 工具更新,即 RC4 版本 ...

  7. 【SF】开源的.NET CORE 基础管理系统 -介绍篇

    [SF]开源的.NET CORE 基础管理系统 -系列导航 1.环境: .NET Core SDK (https://www.microsoft.com/net/core) SQL Server or ...

  8. ASP.NET Core MVC 过滤器介绍

    过滤器的作用是在 Action 方法执行前或执行后做一些加工处理.使用过滤器可以避免Action方法的重复代码,例如,您可以使用异常过滤器合并异常处理的代码. 过滤器如何工作? 过滤器在 MVC Ac ...

  9. AspectCore.Extension.Reflection : .NET Core反射扩展库

    在从零实现AOP的过程中,难免会需要大量反射相关的操作,虽然在.net 4.5+/.net core中反射的性能有了大幅的优化,但为了追求极致性能,自己实现了部分反射的替代方案,包括构造器调用.方法调 ...

随机推荐

  1. GTC 2019参会整理

    NVIDIA GTC 2019在苏州金湖国际会议中心举行,由于同事有其他会议冲突,所以我代替他来参加了此次会议.作为刚接触GPU和机器学习不久的新人来说,感觉进入了一个新世界,深刻体验到技术的革新迭代 ...

  2. python 正则表达式re使用模块(match()、search()和compile())

    摘录 python核心编程 python的re模块允许多线程共享一个已编译的正则表达式对象,也支持命名子组.下表是常见的正则表达式属性: 函数/方法 描述 仅仅是re模块函数 compile(patt ...

  3. Gradle Java 插件

    Java 插件是构建 JVM 项目的基础,它为项目增加了很多能力,例如编译,测试,打包,发布等等. 很多插件都是基于 Java 插件实现的,例如 Android 插件. 用法 使用 id 应用插件 p ...

  4. Office安装时报错1907的解决方法

    大家在装office时可能遇到过1907错误,字体无法注册 的问题,百度后者是采用什么四种方法,我四种方法都试过了没有用,也有人说缺什么日本字体,我也试过了没有用,做为有强迫证的我都重做系统,重下载o ...

  5. 阿里巴巴供应链平台事业部2020届秋招-Java工程师

    阿里巴巴供应链平台事业部,2020届秋季校园招聘开始啦!Java开发工程师虚位以待,机会难得,占坑抓紧. 入职就发师兄,一对一师兄辅导. 在这里,你将有机会接触阿里集团的所有数据库.中间件等基础设施. ...

  6. Netty如何监控内存泄露

    目录 Netty如何监控内存泄露 前言 JDK的弱引用和引用队列 Netty的实现思路 代码实现 分配监控对象 追踪和检查泄露 Netty如何监控内存泄露 前言 一般而言,在Netty程序中都会采用池 ...

  7. 基于H7的中移动物联例子以及简易操作说明,方便电脑端和手机端远程查看数据

    说明: 1.操作前,务必优先看此贴里面的基础例子,先将WIFI连接到路由器上,这样才可以访问外网: https://www.cnblogs.com/armfly/p/11307803.html 2.有 ...

  8. 页面中加入地图map

    1.首先要有密钥AK ,可以自己注册获取或复制别人的 .搜索百度地图API (http://lbsyun.baidu.com/apiconsole/key) 2.地图示例 <head> & ...

  9. JSP的介绍

    JSP概念 JSP全称java server page,中文含义为java服务端页面.对于jsp的理解需要和另外几个相似的概念连接起来:Html和Servlet.常规的html作为一个静态文本传输,具 ...

  10. InnoDB On-Disk Structures(四)--Doublewrite Buffer (转载)

    转载.节选于 https://dev.mysql.com/doc/refman/8.0/en/innodb-doublewrite-buffer.html The doublewrite buffer ...