C#反射回顾笔记
一 、反射概述
反射提供描述程序集、模块和类型的对象(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. LoadFile和LoadFrom方法为在其中必须由路径标识程序集的极少数情况下提供。
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. ReflectionOnlyLoad和ReflectionOnlyLoadFrom方法可加载为反射,而不是执行程序集。 与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#反射回顾笔记的更多相关文章
- iOS回顾笔记( 01 )
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- iOS回顾笔记( 02 ) -- 由九宫格布局引发的一系列“惨案”
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- iOS回顾笔记(03) -- 自定义View的封装和xib文件的使用详解
iOS回顾笔记(03) -- 自定义View的封装和xib文件的使用详解 iOS开发中,我们常常将一块View封装起来,以便于统一管理内部的子控件.如iOS回顾笔记(02)中的"书" ...
- iOS回顾笔记(04) -- UIScrollView的基本使用详解
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- iOS回顾笔记(05) -- 手把手教你封装一个广告轮播图框架
html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,bi ...
- iOS回顾笔记(06) -- AutoLayout从入门到精通
iOS回顾笔记(06) -- AutoLayout从入门到精通 随着iOS设备屏幕尺寸的增多,当下无论是纯代码开发还是Xib/StoryBoard开发,自动布局已经是必备的开发技能了. 我使用自动布局 ...
- iOS回顾笔记(07) -- UITableView的使用和性能优化
iOS回顾笔记(07) -- UITableView的使用和性能优化 如果问iOS中最重要的最常用的UI控件是什么,我觉得UITableView当之无愧!似乎所有常规APP都使用到了UITableVi ...
- iOS回顾笔记(08) -- 自定义Cell的类型和创建步骤总结
iOS回顾笔记(08) -- 自定义Cell的类型和创建步骤总结 项目中我们常见的自定义cell主要分为两种 等高cell:如应用列表.功能列表 非等高cell:如微博列表.QQ聊天页面 下面对这 ...
- iOS回顾笔记(09) -- Cell的添加、删除、更新、批量操作
iOS回顾笔记(09) -- Cell的添加.删除.更新.批量操作 项目中经常有对UITableViewCell做各种操作的需求: 添加一个新的cell 删除某行cell 刷新cell上某行数据(如修 ...
随机推荐
- Java基础面试题1
http://blog.csdn.net/jackfrued/article/details/44921941 1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:抽象 ...
- go语言的内建变量类型
string bool int int8 int16 int32 int64 uintptr 无符号int 类型 (u)int (u)int8 (u)int16 (u)int32 (u)int ...
- [cf920E][set+dfs]
https://codeforc.es/contest/920/problem/E E. Connected Components? time limit per test 2 seconds mem ...
- mysql - InnoDB存储引擎 死锁问题( Deadlock found when trying to get lock; try restarting transaction )
刚刚向数据库插入数据的时候出现了这么一段错误 Deadlock found when trying to get lock; try restarting transaction 主要原因(由于无法使 ...
- Redis的下载、安装及启动
一.下载Redis 1. redis 的下载路径 https://pan.baidu.com/s/1tdMzOlcTlFC7Z3a3I_59hQ 提取码:5tgy 二.安装Redis cd到当前解压目 ...
- js-清空array数组
两种实现方式: 1.splice:删除元素并添加新元素,直接对数组进行修改,返回含有被删除元素的数组. arrayObject.splice(index,howmany,element1,....., ...
- [Luogu] 送花
https://www.luogu.org/problemnew/show/2073 自己yy,明显错 #include <bits/stdc++.h> using namespace s ...
- mac apache 管理
sudo apachectl start sudo apachectl stop sudo apachectl restart
- 内部类访问局部变量时,为什么需要加final关键字
是变量的作用域的问题,因为匿名内部类是出现在一个方法的内部的,如果它要访问这个方法的参数或者方法中定义的变量,则这些参数和变量必须被修饰为final.因为虽然匿名内部类在方法的内部,但实际编译的时候, ...
- spring源码分析:PropertyPlaceholderConfigurer
简介 最近工作中需要使用zookeeper配置中心管理各系统的配置,也就是需要在项目启动时,加载zookeeper中节点的子节点的数据(例如数据库的地址,/config/db.properties/d ...