C# 反射 通过类名创立类实例

   /*参考:http://www.cnblogs.com/encoding/archive/2010/09/10/1823399.html
     *     http://www.cnblogs.com/encoding/archive/2010/09/10/1823444.html
     * */
    /// <summary>
    /// 反射帮助类
    /// </summary>
    public static class ReflectionHelper
    {
        /// <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;//类型转换并返回
        }

        /// <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);
            }
        }
    }

图片 1图片 2

Assembly assembly = Assembly.GetExecutingAssembly(); //
获取当前先后集 
object obj =
assembly.CreateInstance(“类的一心限定名(即包涵取名空间)”); //
创设类的实例,重回为 object 类型,需求强制类型转换

======================================================= 
补充:
壹)反射创立有些类的实例时,必须保险使用类的一心限定名(命名空间 +
类名)。Type.GetType 方法再次来到 null
则代表搜索元数据中的相关音讯退步(反射退步),请确定保证反射时使用类的一点壹滴限定名。
2)反射功效13分强劲,未有啥样不可能达成的。若兑现“跨程序集”,请使用第二种办法创立类的实例,并反射该实例的字段、属性、方法、事件…
然后动态调用之。

 

3、也足以为:

“反射”其实正是运用程序集的元数据音讯。
反射能够有很多措施,编写程序时请伊始入 System.Reflection 命名空间。

二、若要反射当前项目中的类(即当前项目早就引用它了)能够为:

 

一、假设你要反射二个 DLL 中的类,并且没有引用它(即未知的花色): 
Assembly assembly = Assembly.LoadFile(“程序集路径,不能够是相对路径”); //
加载程序集(EXE 或 DLL) 
object obj =
assembly.CreateInstance(“类的一点1滴限定名(即包罗取名空间)”); //
创设类的实例 

Type type = Type.GetType(“类的通通限定名”); 
object obj = type.Assembly.CreateInstance(type); 

View Code

相关文章