C#中的反射

    xiaoxiao2021-12-14  19

    反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成员的名称、限定符和参数等。有了反射,即可对每一个类型了如指掌。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道。

    1.加载程序集:

    /// <summary> /// 加载程序集Dll /// </summary> /// <param name="assPath">程序集DLL路径</param> /// <returns></returns> public static Assembly LoadAssemblyFile(string assPath) { Assembly assembly = Assembly.LoadFile(assPath); return assembly; }

    2.获取一个程序集中的所有类

    /// <summary> /// 获取程序集中所有的类 /// </summary> /// <param name="dllPath">dll程序集的路径</param> /// <returns>dll中所有的类的type对象</returns> public static Type[] GetClassInfo(string dllPath) { Type[] tps = LoadAssemblyFile(dllPath).GetTypes(); return tps; }

    3获取一个类中的所有方法

    /// <summary> /// 获取该类中所有方法 /// </summary> /// <param name="tpe">type 实例化后的type</param> /// <returns>当前type中的所有Method</returns> public static MethodInfo[] GetMethods(Type tpe) { MethodInfo[] metInfo = tpe.GetMethods(); return metInfo; }

    4.获取类中的属性

    /// <summary> /// 获取Type中的属性, /// 如果只穿一个参数Type ,则获取当前Type中所有的 属性 /// 若第二个参数perName指定了获取属性的名称,则返回指定属性名称的单个PropertyInfo[] 且元素为单个值; /// </summary> /// <param name="tpe">type实例对象</param> /// <returns>当前类的所有属性集</returns> public static PropertyInfo[] GetAttributes(Type tpe, string perName = null) { PropertyInfo[] perInfos = tpe.GetProperties(); if (perName == null) { //获取具有指定名称的公共属性 perInfos = new PropertyInfo[] { tpe.GetProperty(perName) }; } return perInfos; }

    5.判断是否集成某个接口,或者某个类

    /// <summary> /// 判断某个类是否继承自某个接口、类的方法 /// itpe 可以是接口,也可以 是类 /// clsType是否继承自 itpe /// </summary> /// <param name="itpe">接口或者类</param> /// <param name="clsType">clsType是否继承自 itpe</param> /// <returns></returns> public static bool IsParent(Type itpe, Type clsType) { //获取所有实现或者继承的接口 Type[] tpes = clsType.GetInterfaces(); //判断是否是接口 if (itpe.IsInterface) { foreach (var nextpe in tpes) { if (itpe == nextpe) { return true; } } } else { do { if (clsType.BaseType == itpe) { return true; } clsType = clsType.BaseType; } while (true); } return false; }

    6.实例化一个对象

    /// <summary> /// 创建对象实例 /// </summary> /// <typeparam name="T">对象名或者接口</typeparam> /// <param name="fullName">命名空间.类型名</param> /// <param name="assemblyName">程序集</param> /// <returns></returns> public static T CreateInstance<T>(string fullName, string assemblyName) { string path = fullName + "," + assemblyName;//命名空间.类型名,程序集 Type o = Type.GetType(path);//加载类型 object obj = Activator.CreateInstance(o, true);//根据类型创建实例 return (T)obj;//类型转换并返回 }

    7.通过反射来执行方法

    /// <summary> /// 通过反射来执行方法 /// </summary> /// <param name="methodName">方法名</param> /// <param name="parms">方法参数,如果是无参方法,则为 Null</param> public static void ExecuteMethod(Type tpe,string methodName,object[] parms) { if (tpe==null) { throw new Exception("tpe 值不能为Null"); } MethodInfo metInfo = tpe.GetMethod(methodName); //根据类型创建实例 object obj = Activator.CreateInstance(tpe, parms); if (parms!=null && parms.Length>0) { metInfo.Invoke(obj, parms); } else { //无参数方法 metInfo.Invoke(obj, null); } }
    转载请注明原文地址: https://ju.6miu.com/read-970190.html

    最新回复(0)