C#反射实例应用--------获取程序集信息和通过类名创建类实例
AppDomain.CurrentDomain.GetAssemblies();获取程序集,但是获取的只是已经加载的dll,引用的获取不到。
System.Reflection.Assembly.GetEntryAssembly().GetReferencedAssemblies(); 获取程序集,包括已经加载的和引用的未加载的dll,
但是获取的不是Assembly对象集,而是AssemblyName对象集。,这一点要清楚。。好的话不多说,开始正题哦。
C#反射获取程序集信息和通过类名创建类实例 。
System.Reflection 命名空间:包含通过检查托管代码中程序集、模块、成员、参数和其他实体的元数据来检索其相关信息的类型。
Assembly 类:表示一个程序集,它是一个可重用、无版本冲突并且可自我描述的公共语言运行库应用程序构造块。
注意下面说到的完全限定名是是指 类的完全限定名(命名空间 + 类名)
1、反射获取程序集信息
1.1 创建AssemblyResult.cs类,用于保存结果
- /// <summary>
- /// 反射结果类
- /// </summary>
- public class AssemblyResult
- {
- /// <summary>
- /// 程序集名称
- /// </summary>
- public List<string> AssemblyName { get; set; }
- /// <summary>
- /// 类名
- /// </summary>
- public List<string> ClassName { get; set; }
- /// <summary>
- /// 类的属性
- /// </summary>
- public List<string> Properties { get; set; }
- /// <summary>
- /// 类的方法
- /// </summary>
- public List<string> Methods { get; set; }
- }
1.2 创建AssemblyHandler.cs反射处理类
注意:要引用System.Reflection 命名空间。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Reflection;
- using System.IO;
- namespace MyStudyFrom
- {
- /// <summary>
- /// 反射处理类
- /// </summary>
- public class AssemblyHandler
- {
- string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"/he.dll/";
- /// <summary>
- /// 获取程序集名称列表
- /// </summary>
- public AssemblyResult GetAssemblyName()
- {
- AssemblyResult result = new AssemblyResult();
- string[] dicFileName = Directory.GetFileSystemEntries(path);
- if(dicFileName!=null)
- {
- List<string> assemblyList = new List<string>();
- foreach(string name in dicFileName)
- {
- assemblyList.Add(name.Substring(name.LastIndexOf('/') + 1));
- }
- result.AssemblyName = assemblyList;
- }
- return result;
- }
- /// <summary>
- /// 获取程序集中的类名称
- /// </summary>
- /// <param name="assemblyName">程序集</param>
- public AssemblyResult GetClassName(string assemblyName)
- {
- AssemblyResult result = new AssemblyResult();
- if (!String.IsNullOrEmpty(assemblyName))
- {
- assemblyName = path + assemblyName;
- Assembly assembly = Assembly.LoadFrom(assemblyName);
- Type[] ts = assembly.GetTypes();
- List<string> classList = new List<string>();
- foreach (Type t in ts)
- {
- //classList.Add(t.Name);
- classList.Add(t.FullName);
- }
- result.ClassName = classList;
- }
- return result;
- }
- /// <summary>
- /// 获取类的属性、方法
- /// </summary>
- /// <param name="assemblyName">程序集</param>
- /// <param name="className">类名</param>
- public AssemblyResult GetClassInfo(string assemblyName, string className)
- {
- AssemblyResult result = new AssemblyResult();
- if (!String.IsNullOrEmpty(assemblyName) && !String.IsNullOrEmpty(className))
- {
- assemblyName = path + assemblyName;
- Assembly assembly = Assembly.LoadFrom(assemblyName);
- Type type = assembly.GetType(className,true,true);
- if (type != null)
- {
- //类的属性
- List<string> propertieList = new List<string>();
- PropertyInfo[] propertyinfo = type.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
- foreach (PropertyInfo p in propertyinfo)
- {
- propertieList.Add(p.ToString());
- }
- result.Properties = propertieList;
- //类的构造函数
- //1、无参构造函数
- ConstructorInfo constructor = type .GetConstructor(Type.EmptyTypes);
- //通过构造函数初始化实例对象,该对象可以用于方法、属性的调用与设置
- Object constructorObject = constructor.Invoke(new Object[]{ });
- //2、有参构造函数
- ConstructorInfo constructor = type .GetConstructor(Type.EmptyTypes);
- //具体几个参数,可以在new Object[]{1 }这里面设置
- Object constructorObject = constructor.Invoke(new Object[]{1 });
- //ConstructorInfo constructor = type .GetConstructor(Type.EmptyTypes);
- ////通过构造函数初始化实例对象,该对象可以用于方法、属性的调用与设置
- //Object constructorObject = constructor.Invoke(new Object[]{ });
- //类的方法
- List<string> methods = new List<string>();
- MethodInfo[] methodInfos = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
- foreach (MethodInfo mi in methodInfos)
- {
- methods.Add(mi.Name);
- //方法的参数
- //foreach (ParameterInfo p in mi.GetParameters())
- //{
- //}
- //方法的返回值
- //string returnParameter = mi.ReturnParameter.ToString();
- }
- result.Methods = methods;
- }
- }
- return result;
- }
- }
- }
2、通过类名创建类实例
2.1、假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型):
Assembly assembly = Assembly.LoadFile("程序集路径,不能是相对路径"); // 加载程序集(EXE 或 DLL)
object obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)"); // 创建类的实例
2.2、若要反射当前项目中的类可以为:
Assembly assembly = Assembly.GetExecutingAssembly(); // 获取当前程序集
object obj = assembly.CreateInstance("类的完全限定名(即包括命名空间)");
// 创建类的实例,返回为 object 类型,需要强制类型转换
2.3、也可以为:
Type type = Type.GetType("类的完全限定名");
object obj = type.Assembly.CreateInstance(type);
2.4、还可以(建议使用这种方法):
Type type = assembly.GetType();
Object object = System.Activator.CreateInstance(type);//需要转换成对应的控件对象
=======================================================
补充:
1)反射创建某个类的实例时,必须保证使用类的完全限定名(命名空间 + 类名)。
Type.GetType 方法返回 null 则意味搜索元数据中的相关信息失败(反射失败),请确保反射时使用类的完全限定名。
2)反射功能十分强大,没有什么不能实现的。若实现“跨程序集”,请使用第一种方法创建类的实例,并反射该实例的字段、属性、方法、事件等,然后就可以进行动态的调用它们了。
C#反射实例应用--------获取程序集信息和通过类名创建类实例的更多相关文章
- C#反射 获取程序集信息和通过类名创建类实例(转载)
C#反射获取程序集信息和通过类名创建类实例 . System.Reflection 命名空间:包含通过检查托管代码中程序集.模块.成员.参数和其他实体的元数据来检索其相关信息的类型. Assembly ...
- C# 反射 通过类名创建类实例
“反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): ...
- 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值
前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能 ...
- Delphi Mercadopago支付【支持支持获取账户信息和余额、创建商店,商店查询、创建二维码、二维码查询、创建订单、订单查询、订单退款等功能】
作者QQ:(648437169) 点击下载➨Delphi Mercadopago支付 [Delphi Mercadopago支付]支持 支持支持获取账户信息和余额.创建商店,商店查询.创建二维码.二维 ...
- XAML实例教程系列 - XAML传递参数到值转换类实例 八
Kevin Fan分享开发经验,记录开发点滴 XAML实例教程系列 - XAML传递参数到值转换类实例 2012-06-28 05:25 by jv9, 508 阅读, 0 评论, 收藏, 编辑 继上 ...
- WPF 获取程序路径的一些方法,根据程序路径获取程序集信息
一.WPF 获取程序路径的一些方法方式一 应用程序域 //获取基目录即当前工作目录 string str_1 = System.AppDomain.CurrentDomain.BaseDirector ...
- Java反射机制能够获取的信息,与应用
一.什么是Java反射机制? [1]反射机制是在运行状态中,对于任何一个类,都能够知道这个类的所有属性和方法: [2]对于任意一个对象,都能够调用它的任意一个属性和方法: 像这种动态获取类的信息以及动 ...
- java反射子之获取方法信息(二)
一.获取方法 1.方法作用. 2. 二.获取方法信息.(修饰符,返回值,方法名称,参数列表,抛出的异常). ############################################## ...
- Python3类和实例之获取对象信息
当我们拿到一个对象的引用时,如何知道这个对象是什么类型,有哪些方法呢 使用type() 判断对象类型使用type()函数 基本类型都可以用type()判断 <class 'int'> &g ...
随机推荐
- linux系统文件属性
1 硬链接概念 硬链接是指通过索引节点(Inode)来进行链接,在Linux(ext2,ext3)文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,这个编号被称为索引节点编号(I ...
- 第十二篇、HTML常用框架收集
1.Swiper 广告轮播插件 2.Bootstrap 响应式布局 3.jQuery js兼容插件 4.jQuery Mobile 5.phoneGap
- ugui自制摇杆。
珍爱生命,远离插件. 以上8个字,好好理解. 反正我是这么觉得. 我说的是unity,不是魔兽世界. 总有一天,我会一句一句写出属于自己的东西. 可以开始主题了. 如图所示,建立一个画 ...
- c++ 继承学习笔记
三大继承原则(由我杜撰) 基类的私有成员被继承后不可见(优先级最高) 公有继承不改变基类成员属性 保护继承(私有继承)把基类成员变为保护成员(私有成员)
- centos6.5 安装python2.7.5
1. 下载python2.7.5,保存到 /data/http://www.python.org/ftp/python/ 2. 解压文件tar xvf Python-2.7.5.tar.bz2 3. ...
- new static() 和 new self() 的区别异同
长夜漫漫啊! 今天领导本地搭建一个站.发现用PHP 5.2 搭建不起来,站PHP代码里面有很多5.3以上的部分,领导让苦逼我更改在5.2下能运行. 改着改着发现了一个地方 return new sta ...
- windows 8.1 pro X64安装中断
用PE安装windows 8.1 pro X64 ISO镜像,快完成的时候卡在蓝色背景那不动了,等待了大概30min强制重启了. 奇怪的是,居然进去了,不过很慢.配置了一段时间终于看到桌面了,关机,失 ...
- C#对XML、JSON等格式的解析
C#对XML.JSON等格式的解析 一.C#对XML格式数据的解析 1.用XMLDocument来解析 XmlDocument xmlDocument = new XmlDocument(); xml ...
- c#个人记录常用方法(更新中)
1.日期毫秒转换为标准的C#日期格式 //使用时,先将秒Convert.ToInt64,返回格式2015-2-10 14:03:33 public DateTime JavaTimeToC(long ...
- mui 重写back 调用back方法,实现返回就即时刷新页面
需求: 从A-----b页面 B操作完后再返回A ,这时A页面数据变化 1.先是针对安卓机可以点击按钮返回,也可以用本机的返回键返回 监听本机的返回按钮,如果点击就调用写好的自定义刷新事件 (fun ...