zoukankan      html  css  js  c++  java
  • C#反射 获取程序集信息和通过类名创建类实例(转载)

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

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

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

    1、反射获取程序集信息

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

     

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

    1.2 创建AssemblyHandler.cs反射处理类

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

     

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

    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)反射功能十分强大,没有什么不能实现的。若实现“跨程序集”,请使用第一种方法创建类的实例,并反射该实例的字段、属性、方法、事件... 然后动态调用之。

  • 相关阅读:
    去除文本多余空行
    自定义裁剪图片
    遍历文件目录下所有图片并保存到统一路径
    根据节点解析xml
    坐标转换——GCJ-02
    获取进程列表
    判断进程状态
    VSDK modify HDMI resolution
    mcspi
    TI RTOS
  • 原文地址:https://www.cnblogs.com/micro-chen/p/4250130.html
Copyright © 2011-2022 走看看