C#反射获取程序集信息和通过类名创建类实例 。

System.Reflection 命名空间:包含通过检查托管代码中程序集、模块、成员、参数和其他实体的元数据来检索其相关信息的类型。

Assembly 类:表示一个程序集,它是一个可重用、无版本冲突并且可自我描述的公共语言运行库应用程序构造块。

1、反射获取程序集信息

1.1 创建AssemblyResult.cs类,用于保存结果

  1. /// <summary>
  2. /// 反射结果类
  3. /// </summary>
  4. public class AssemblyResult
  5. {
  6. /// <summary>
  7. /// 程序集名称
  8. /// </summary>
  9. public List<string> AssemblyName { get; set; }
  10. /// <summary>
  11. /// 类名
  12. /// </summary>
  13. public List<string> ClassName { get; set; }
  14. /// <summary>
  15. /// 类的属性
  16. /// </summary>
  17. public List<string> Properties { get; set; }
  18. /// <summary>
  19. /// 类的方法
  20. /// </summary>
  21. public List<string> Methods { get; set; }
  22. }

1.2 创建AssemblyHandler.cs反射处理类

注意:要引用System.Reflection 命名空间。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Reflection;
  6. using System.IO;
  7. namespace MyStudyFrom
  8. {
  9. /// <summary>
  10. /// 反射处理类
  11. /// </summary>
  12. public class AssemblyHandler
  13. {
  14. string path = AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"/MyDLL/";
  15. /// <summary>
  16. /// 获取程序集名称列表
  17. /// </summary>
  18. public AssemblyResult GetAssemblyName()
  19. {
  20. AssemblyResult result = new AssemblyResult();
  21. string[] dicFileName = Directory.GetFileSystemEntries(path);
  22. if(dicFileName!=null)
  23. {
  24. List<string> assemblyList = new List<string>();
  25. foreach(string name in dicFileName)
  26. {
  27. assemblyList.Add(name.Substring(name.LastIndexOf('/') + 1));
  28. }
  29. result.AssemblyName = assemblyList;
  30. }
  31. return result;
  32. }
  33. /// <summary>
  34. /// 获取程序集中的类名称
  35. /// </summary>
  36. /// <param name="assemblyName">程序集</param>
  37. public AssemblyResult GetClassName(string assemblyName)
  38. {
  39. AssemblyResult result = new AssemblyResult();
  40. if (!String.IsNullOrEmpty(assemblyName))
  41. {
  42. assemblyName = path + assemblyName;
  43. Assembly assembly = Assembly.LoadFrom(assemblyName);
  44. Type[] ts = assembly.GetTypes();
  45. List<string> classList = new List<string>();
  46. foreach (Type t in ts)
  47. {
  48. //classList.Add(t.Name);
  49. classList.Add(t.FullName);
  50. }
  51. result.ClassName = classList;
  52. }
  53. return result;
  54. }
  55. /// <summary>
  56. /// 获取类的属性、方法
  57. /// </summary>
  58. /// <param name="assemblyName">程序集</param>
  59. /// <param name="className">类名</param>
  60. public AssemblyResult GetClassInfo(string assemblyName, string className)
  61. {
  62. AssemblyResult result = new AssemblyResult();
  63. if (!String.IsNullOrEmpty(assemblyName) && !String.IsNullOrEmpty(className))
  64. {
  65. assemblyName = path + assemblyName;
  66. Assembly assembly = Assembly.LoadFrom(assemblyName);
  67. Type type = assembly.GetType(className,true,true);
  68. if (type != null)
  69. {
  70. //类的属性
  71. List<string> propertieList = new List<string>();
  72. PropertyInfo[] propertyinfo = type.GetProperties(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
  73. foreach (PropertyInfo p in propertyinfo)
  74. {
  75. propertieList.Add(p.ToString());
  76. }
  77. result.Properties = propertieList;
  78. //类的方法
  79. List<string> methods = new List<string>();
  80. MethodInfo[] methodInfos = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
  81. foreach (MethodInfo mi in methodInfos)
  82. {
  83. methods.Add(mi.Name);
  84. //方法的参数
  85. //foreach (ParameterInfo p in mi.GetParameters())
  86. //{
  87. //}
  88. //方法的返回值
  89. //string returnParameter = mi.ReturnParameter.ToString();
  90. }
  91. result.Methods = methods;
  92. }
  93. }
  94. return result;
  95. }
  96. }
  97. }

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#反射 获取程序集信息和通过类名创建类实例(转载)的更多相关文章

  1. C#反射实例应用--------获取程序集信息和通过类名创建类实例

    AppDomain.CurrentDomain.GetAssemblies();获取程序集,但是获取的只是已经加载的dll,引用的获取不到. System.Reflection.Assembly.Ge ...

  2. 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值

    前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能 ...

  3. C# 反射 通过类名创建类实例

    “反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): ...

  4. WPF 获取程序路径的一些方法,根据程序路径获取程序集信息

    一.WPF 获取程序路径的一些方法方式一 应用程序域 //获取基目录即当前工作目录 string str_1 = System.AppDomain.CurrentDomain.BaseDirector ...

  5. c#反射机制学习和利用反射获取类型信息

    反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...

  6. Delphi Mercadopago支付【支持支持获取账户信息和余额、创建商店,商店查询、创建二维码、二维码查询、创建订单、订单查询、订单退款等功能】

    作者QQ:(648437169) 点击下载➨Delphi Mercadopago支付 [Delphi Mercadopago支付]支持 支持支持获取账户信息和余额.创建商店,商店查询.创建二维码.二维 ...

  7. 根据反射获取属性信息并创建DataTable

    查看了一些方法之后,做了一些总结,此方法适用于传进的参数是List<T>类型, 但事先并不知道T的类型,T可以是自定义类型. public DataTable CreateDataTabl ...

  8. C# 利用反射根据类名创建类的实例对象

    “反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): ...

  9. 【转】C# 利用反射根据类名创建类的实例对象

    原文地址:https://www.cnblogs.com/feiyuhuo/p/5793606.html “反射”其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System ...

随机推荐

  1. HDU_2014——计算平均分

    Problem Description 青年歌手大奖赛中,评委会给参赛选手打分.选手得分规则为去掉一个最高分和一个最低分,然后计算平均得分,请编程输出某选手的得分.   Input 输入数据有多组,每 ...

  2. 黑马程序员_<<IO流基本操作(Writer,Reader)>>

    --------------------ASP.Net+Android+IOS开发..Net培训.期待与您交流! -------------------- 1.概述 硬盘之间的文件的传输,硬盘中文件的 ...

  3. <Win32_9>有意思的程序——抓取屏幕

    Win32学了一段时间了,跟着杨老师的脚步,准备学习MFC,因此最近几天在复习C++,于是发现有将近一周没写博文了…… 今天来写一个较为简单.但是比较有意思的东西 不知大家在理发店理发的时候注意到一个 ...

  4. SOFTWARE_INTRODUCE_01

    &amp;amp;amp;amp;lt;br data-mce-bogus="1"&amp;amp;amp;amp;gt;&amp;amp;amp;amp; ...

  5. Mina入门实例

    继续上一篇,这篇主要讲通过mina往B端发送消息.并接受消息,mina是一个网络通信框架,封装了javaNIO.简单易用.网上有非常多关于他的介绍,在此不赘述了. 如上篇所介绍,完毕功能,须要五个类: ...

  6. 局域网指定 IP 地址后无法上网的问题

    子网掩码.默认网关.DNS 与局域网设置有关,建议指定前先 运行 cmd -> ipconfig /all 查看一下自动获取的信息. 另外留意指定IP 后需打开高级设置 -> WINS,勾 ...

  7. Facebook登录 AndroidStudio

    简介 主页:https://www.facebook.com/ Android开发者支持:https://developers.facebook.com/docs/android/  应用管理:htt ...

  8. Request.ServerVariables 服务器环境变量

    Request.ServerVariables["Url"] 返回服务器地址 Request.ServerVariables["Path_Info"] 客户端提 ...

  9. (转)VS无法启动调试:“生成下面的模块时,启用了优化或没有调试信息“

    中调试项目遇到错误提示,Visual Studio 2010(或VS2008或VS2005)启动调试的时候,弹出提示信息: 生成下面的模块时,启用了优化或没有调试信息: C:\WINDOWS\Micr ...

  10. 什么是 Terminal

    从用户的角度来看,Terminal 是键盘和显示器的组合,也称为 TTY(电传打字机的缩写).键盘输入字符,显示器显示字符. 从进程的角度来看,终端是字符设备,可以通过 read.write.ioct ...