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上某行数据(如修 ...
随机推荐
- machine learning(10) -- classification:logistic regression cost function 和 使用 gradient descent to minimize cost function
logistic regression cost function(single example) 图像分布 logistic regression cost function(m examples) ...
- glog的安装使用
参考 :https://blog.csdn.net/Pig_Pig_Bang/article/details/81632962 https://blog.csdn.net/cywtd/article/ ...
- js实现发送验证码倒计时效果
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Max Tree
Description Given an integer array with no duplicates. A max tree building on this array is defined ...
- Greenplum 如何直连segment节点
Greenplum 展开阅读全文 直连greenplum segment节点的方法, utility模式 : 使用这种方式,不与其他节点通讯,只操作当前节点.也没有数据分布的概念. 如果使用uti ...
- bzoj 3420: Poi2013 Triumphal arch 树形dp+二分
给一颗树,$1$ 号节点已经被染黑,其余是白的,两个人轮流操作,一开始 $B$ 在 $1$ 号节点,$A$ 选择 $k$ 个点染黑,然后 $B$ 走一步,如果 $B$ 能走到 $A$ 没染的节点则 $ ...
- 齿轮 HYSBZ - 4602 (DFS实现)
齿轮 HYSBZ - 4602 题意:很好理解就不啰嗦了. 致谢:感谢队友小明. 题解:嗯,一开始想到的是并查集,后来,就先看了另一道题,xj写dfs和暴力,就卡死了.于是来补这题了,前向星建图 题解 ...
- 下载MAMP
下载https://www.mamp.info/en/downloads/ MAMP PRO will create copies of the MySQL databases located in ...
- phpstorm 2019.1 mac
链接:https://pan.baidu.com/s/10x0Oa24aOZHJYCYgUGe8yg 密码:muah 安装完成后, sudo vi /etc/hosts 添加以下内容到hosts 0 ...
- docker安装ubuntu以后无ifconfig命令解决办法
解决: 1.apt-get update 2.apt install net-tools #ifcongig 3.apt install iputils-ping # ping