一 、反射概述

反射提供描述程序集、模块和类型的对象(Type 类型)。 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后调用其方法或访问其字段和属性。 如果代码中使用了特性,可以利用反射来访问它们。

反射在以下情况下很有用:

  • 需要访问程序元数据中的特性时。

  • 检查和实例化程序集中的类型。

  • 在运行时构建新类型。

  • 执行后期绑定,访问在运行时创建的类型上的方法。

二 、Type对象

Type:表示类型声明:类类型、接口类型、数组类型、值类型、枚举类型、类型参数、泛型类型定义,以及开放或封闭构造的泛型类型。

如何获取Type?

1. Type t =  typeof(String); String可以是其他类型

2. Type t =  String.GetType();

3. Type t = Type.GetType("System.String"); 及相关重载,注意参数包含命名空间

更多方式参见 https://docs.microsoft.com/zh-cn/dotnet/api/system.type?view=netframework-4.7.2

三 、Assembly对象

Assembly:使用 Assembly 来定义和加载程序集,加载程序集清单中列出的模块,以及在此程序集中定位一个类型并创建一个它的实例。

如何获取Assembly?

1. 加载程序集的建议的方法是使用Load方法,它标识要按其显示名称加载的程序集 (例如,"System.Windows.Forms、 版本 = 2.0.0.0,区域性 = 中性,PublicKeyToken = b77a5c561934e089")。

Assembly assembly=Assembly.Load("System");  参数为名称空间

2. LoadFileLoadFrom方法为在其中必须由路径标识程序集的极少数情况下提供。

Assembly a = Assembly.LoadFile(@"D:\C#\ReflectTest\ReflectTest\dll\Utility.dll");  dll或exe全路径

Assembly a = Assembly.LoadForm(@"D:\C#\ReflectTest\ReflectTest\dll\Utility.dll");

3. ReflectionOnlyLoadReflectionOnlyLoadFrom方法可加载为反射,而不是执行程序集。 与Load,LoadForm类似

四 、获取指定程序集类的方法

public static void Main(string[] args)
{
Assembly a = Assembly.Load("ReflectTest");
Type t = a.GetType("ReflectTest.Program");
var isnt = Activator.CreateInstance(t);
foreach (var method in t.GetMethods())
{
//激活方法
method.Invoke(t, null);
}
}

参数由第二个入参确定,一般多个参数建议使用object传入(当入参变更时可以减少代码修改)

如需获取私有等方法可以使用重载public MethodInfo GetMethod(string name, BindingFlags bindingAttr);等借助BindingFlags对象实现。

五 、获取指定程序集类的属性

public static void Main(string[] args)
{
Assembly a = Assembly.Load("ReflectTest");
Type t = a.GetType("ReflectTest.Program");
var isnt = Activator.CreateInstance(t);
foreach (var propt in t.GetProperties())
{ Console.WriteLine(propt.Name);
}
}

应用:利用反射将dataTable填充至泛型对象

/// <summary>
/// DataTable利用泛型填充实体类
/// </summary>
/// <typeparam name="T">实体类</typeparam>
/// <param name="table">dt</param>
/// <returns></returns>
public static IList<T> DataTableToList<T>(DataTable table)
{
IList<T> list = new List<T>();
T t = default(T);
PropertyInfo[] propertypes = null;
string tempName = string.Empty;
foreach (DataRow row in table.Rows)
{
t = Activator.CreateInstance<T>();
propertypes = t.GetType().GetProperties();
foreach (PropertyInfo pro in propertypes)
{
tempName = pro.Name;
if (table.Columns.Contains(tempName))
{
string value = row[tempName].ToString();
pro.SetValue(t, value, null);
}
}
list.Add(t);
}
return list;
}

C#反射回顾笔记的更多相关文章

  1. iOS回顾笔记( 01 )

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  2. iOS回顾笔记( 02 ) -- 由九宫格布局引发的一系列“惨案”

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  3. iOS回顾笔记(03) -- 自定义View的封装和xib文件的使用详解

    iOS回顾笔记(03) -- 自定义View的封装和xib文件的使用详解 iOS开发中,我们常常将一块View封装起来,以便于统一管理内部的子控件.如iOS回顾笔记(02)中的"书" ...

  4. iOS回顾笔记(04) -- UIScrollView的基本使用详解

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  5. iOS回顾笔记(05) -- 手把手教你封装一个广告轮播图框架

    html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...

  6. iOS回顾笔记(06) -- AutoLayout从入门到精通

    iOS回顾笔记(06) -- AutoLayout从入门到精通 随着iOS设备屏幕尺寸的增多,当下无论是纯代码开发还是Xib/StoryBoard开发,自动布局已经是必备的开发技能了. 我使用自动布局 ...

  7. iOS回顾笔记(07) -- UITableView的使用和性能优化

    iOS回顾笔记(07) -- UITableView的使用和性能优化 如果问iOS中最重要的最常用的UI控件是什么,我觉得UITableView当之无愧!似乎所有常规APP都使用到了UITableVi ...

  8. iOS回顾笔记(08) -- 自定义Cell的类型和创建步骤总结

    iOS回顾笔记(08) -- 自定义Cell的类型和创建步骤总结 项目中我们常见的自定义cell主要分为两种 等高cell:如应用列表.功能列表 非等高cell:如微博列表.QQ聊天页面 下面对这 ...

  9. iOS回顾笔记(09) -- Cell的添加、删除、更新、批量操作

    iOS回顾笔记(09) -- Cell的添加.删除.更新.批量操作 项目中经常有对UITableViewCell做各种操作的需求: 添加一个新的cell 删除某行cell 刷新cell上某行数据(如修 ...

随机推荐

  1. js 面向对象之构造器与工厂函数

    字面量模式声明一个对象实例 let m = {name: "lisi", age:15} m.constructor // ƒ Object() { [native code] } ...

  2. SpringBoot项目启动报错:java.lang.RuntimeException: java.lang.reflect.InvocationTargetException

    .   ____          _            __ _ _ /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \( ( )\___ | '_ | '_| | ...

  3. BZOJ3678 wangxz与OJ (平衡树 无旋treap)

    题面 维护一个序列,支持以下操作: 1.在某个位置插入一段值连续的数. 2.删除在当前序列位置连续的一段数. 3.查询某个位置的数是多少. 题解 显然平衡树,一个点维护一段值连续的数,如果插入或者删除 ...

  4. markdown 显示图片的三种方式

    插入网络图片 插入本地图片 base64 图片(data:image/png;base64,iVBORw0KG........) ps:base64编码的图片可以通过站长工具编码 https://to ...

  5. Learning Spark (Python版) 学习笔记(一)----RDD 基本概念与命令

    <Learning Spark>这本书算是Spark入门的必读书了,中文版是<Spark快速大数据分析>,不过豆瓣书评很有意思的是,英文原版评分7.4,评论都说入门而已深入不足 ...

  6. HashMap与HashTable的理解与区别

    Hashtable是java一开始发布时就提供的键值映射的数据结构,而HashMap产生于JDK1.2.虽然Hashtable比HashMap出现的早一些,但是现在Hashtable基本上已经被弃用了 ...

  7. CSS 布局和 BFC

    什么是 BFC 在一个Web页面的CSS渲染中,块级格式化上下文 (Block Fromatting Context)是按照块级盒子布局的.W3C对BFC的定义如下:浮动元素和绝对定位元素,非块级盒子 ...

  8. Ubuntu18.04开机动画(bootsplash)安装

    一.搜索喜欢的主题 1.通过软件源搜索,这个比较简单但是没有太喜欢的.-----------------------------------------------------------pipci@ ...

  9. [Zhx] 无题

    https://www.luogu.org/problemnew/show/T15368 区间修改,区间查询k(<= 10)大值 应该也可以用分块写 #include <cstdio> ...

  10. Python3循环

    Python中while语句的一般形式: while 判断条件: 语句 同样需要注意冒号和缩进,另外在Python中没有do…while循环 下面的实例计算1到100总和 ##calc.py n = ...