C#反射 获取程序集信息和通过类名创建类实例(转载)
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 + @"/MyDLL/";
- /// <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;
- //类的方法
- 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);
=======================================================
补充:
1)反射创建某个类的实例时,必须保证使用类的完全限定名(命名空间 + 类名)。Type.GetType 方法返回 null 则意味搜索元数据中的相关信息失败(反射失败),请确保反射时使用类的完全限定名。
2)反射功能十分强大,没有什么不能实现的。若实现“跨程序集”,请使用第一种方法创建类的实例,并反射该实例的字段、属性、方法、事件... 然后动态调用之。
C#反射 获取程序集信息和通过类名创建类实例(转载)的更多相关文章
- C#反射实例应用--------获取程序集信息和通过类名创建类实例
AppDomain.CurrentDomain.GetAssemblies();获取程序集,但是获取的只是已经加载的dll,引用的获取不到. System.Reflection.Assembly.Ge ...
- 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值
前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能 ...
- C# 反射 通过类名创建类实例
“反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): ...
- WPF 获取程序路径的一些方法,根据程序路径获取程序集信息
一.WPF 获取程序路径的一些方法方式一 应用程序域 //获取基目录即当前工作目录 string str_1 = System.AppDomain.CurrentDomain.BaseDirector ...
- c#反射机制学习和利用反射获取类型信息
反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...
- Delphi Mercadopago支付【支持支持获取账户信息和余额、创建商店,商店查询、创建二维码、二维码查询、创建订单、订单查询、订单退款等功能】
作者QQ:(648437169) 点击下载➨Delphi Mercadopago支付 [Delphi Mercadopago支付]支持 支持支持获取账户信息和余额.创建商店,商店查询.创建二维码.二维 ...
- 根据反射获取属性信息并创建DataTable
查看了一些方法之后,做了一些总结,此方法适用于传进的参数是List<T>类型, 但事先并不知道T的类型,T可以是自定义类型. public DataTable CreateDataTabl ...
- C# 利用反射根据类名创建类的实例对象
“反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): ...
- 【转】C# 利用反射根据类名创建类的实例对象
原文地址:https://www.cnblogs.com/feiyuhuo/p/5793606.html “反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System ...
随机推荐
- FreeMarker---数据类型
1.a.ftl 你好,${user},今天你的精神不错! ----------------------------- 测试if语句: <#if user=="老高"> ...
- 创建第一个freemarker
1.创建java项目TestFreeMarker 2.导入包freemarker.jar,添加依赖 3.在根目录下创建一个文件夹templates 4.在文件夹templates下创建文件a.ftl ...
- Jquery css函数用法(判断标签是否拥有某属性)
判断一个层是否隐藏:$("#id").css("display")=="none" ;在所有匹配的元素中,设置一个样式属性的值:$(&qu ...
- 二十六个月Android学习工作总结
1.客户端的功能逻辑不难,UI界面也不难,但写UI花的时间是写功能逻辑的两倍. 2.写代码前的思考过程非常重要,即使在简单的功能,也需要在本子上把该功能的运行过程写出来. 3.要有自己的知识库,可以是 ...
- Linux安装Weblogic9.2
1.先确认安装的环境是不是LINUX AS 4 [root@yaoxj ~]# cat /etc/issue Red Hat Enterprise Linux AS release 4 (Nahant ...
- HDU2841 Visible Trees (容斥原理)
主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2841 题意: 一个人在(0,0)点,然后前面有一个m*n的格子 ,每一个格子的节点上有一棵树.问这个人 ...
- Android getResources的作用和须要注意点
今天做一个Android的文件管理器,里面用到非常多的地方用到了getResources. Drawable currentIcon = null; currentIcon = getResource ...
- 标准爬虫初探,来自Python之父的大餐!
首先不得不承认自己做了标题党.本文实质是分析500lines or less的crawlproject,这个project的地址是https://github.com/aosabook/500line ...
- 第四章 Activity和Activity调用栈分析 系统信息与安全机制 性能优化
1.Activity生命周期理解生命周期就是两张图:第一张图是回字型的生命周期图第二张图是金字塔型的生命周期图 注意点(1)从stopped状态重新回到前台状态的时候会先调用onRestart方法,然 ...
- rpm软件包类型
rpm软件包 在linux世界里有两种流行的包管理方式,分别是redhat系的rpm和debian系的deb.其中rpm是RedHat Package Manager(RedHat软件包管理工具)的简 ...