反射
反射:使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性。 反射有个最常用的用法:一般客户端软件都会有升级功能,这个就是通过反射取到当前版本信息,再和服务器上最新的版本信息比较,如果客户端已经不是最新版本,那么就会提示你升级。 反射还可以通过指定程序集、命名空间和类名动态创建类的实例。 通过下面一段代码来了解反射创建对象的使用
代码
using System; using System.Reflection;
namespace Dxy.ReflectionTest { /// <summary> /// 反射帮助类 /// </summary> public static class ReflectionHelper { /// <summary> /// 创建对象实例 /// </summary> /// <typeparam name="T">要创建对象的类型</typeparam> /// <param name="assemblyName">类型所在程序集名称</param> /// <param name="nameSpace">类型所在命名空间</param> /// <param name="className">类型名</param> /// <returns></returns> public static T CreateInstance<T>(string assemblyName,string nameSpace, string className) { try { string fullName = nameSpace + "." + className;//命名空间.类型名 //此为第一种写法 object ect = Assembly.Load(assemblyName).CreateInstance(fullName);//加载程序集,创建程序集里面的 命名空间.类型名 实例 return (T)ect;//类型转换并返回 //下面是第二种写法 //string path = fullName + "," + assemblyName;//命名空间.类型名,程序集 //Type o = Type.GetType(path);//加载类型 //object obj = Activator.CreateInstance(o, true);//根据类型创建实例 //return (T)obj;//类型转换并返回 } catch { //发生异常,返回类型的默认值 return default(T); } } } }
调用方需要知道要创建实例的类所在程序集、命名空间和类名,如下
代码
using System;
namespace Dxy.ReflectionTest { class Program { static void Main(string[] args) { ITest test = ReflectionHelper.CreateInstance<ITest>("ReflectionTest", "Dxy.ReflectionTest", "Test"); Console.WriteLine(test.Name); Console.ReadLine(); } } }
|
请发表评论