zoukankan      html  css  js  c++  java
  • 反射获取类型

    winform开发中经常使用反射来动态配置程序!例如将所有窗体放到一个dll里使用的时候通过反射来加载窗体以实现灵活配置!

    今天就针对反射获取类型给出自己的一些代码:

    using System;
    using System.IO;
    using System.Collections.Generic;
    using static System.Console;
    using System.Reflection;
    using System.Text;

    namespace Gaofajin.DllHandler
    {
       public class ReflectionHelper
        {
         /// <summary>
         ///  反射创建类实例
         /// </summary>
         /// <typeparam name="T"></typeparam>
         /// <param name="fullname">名称空间.类名</param>
         /// <param name="assemblyName">Dll名.dll</param>
         /// <returns></returns>
            public static T CreateInstance<T>(string fullname,string assemblyName)
            {
                try
                {
                    string path = fullname + "," + assemblyName;
                    Type tp = Type.GetType(path, true);
                    return (T)Activator.CreateInstance(tp, true);
                }
                catch
                {
                    return default(T);
                }
            }
            /// <summary>
            /// 反射创建类实例
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="assemblyName">必须使用全路径,此处如果只有dll名称则默认在程序启动目录下找</param>
            /// <param name="nameSpace"></param>
            /// <param name="className"></param>
            /// <returns></returns>
            public static T CreateInstanceByLoadFile<T>(string assemblyName,string nameSpace,string className)
            {
                if (!assemblyName.Contains("\\"))
                {
                    assemblyName = System.Windows.Forms.Application.StartupPath + "\\" + assemblyName;
                }
                try
                {
                    string fullName = nameSpace + "." + className;
                    Assembly ass = Assembly.LoadFile(assemblyName);
                   object obj= ass.CreateInstance(fullName);
                    return (T)obj;
                }
                catch
                {
                    return default(T);
                }

            }
            /// <summary>
            ///  反射创建类实例
            /// </summary>
            /// <typeparam name="T">返回类型</typeparam>
            /// <param name="assemblyName">这个参数实际上是需要加载的程序集的强名称(名称,版本,语言,公钥标记)。例如.NET 2.0中的FileIOPermission类,它的强名称是:
            ///System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</param>
            /// <param name="nameSpace">名称空间</param>
            /// <param name="className">类名</param>
            /// <returns></returns>
            public static T CreateInstanceByLoad<T>(string assemblyName, string nameSpace, string className)
            {
              
                try
                {
                    string fullName = nameSpace + "." + className;
                    Assembly ass = Assembly.Load(assemblyName);
                    object obj = ass.CreateInstance(fullName);
                    return (T)obj;
                }
                catch
                {
                    return default(T);
                }

            }
            /// <summary>
            ///  反射创建类实例
            /// </summary>
            /// <typeparam name="T">返回类型</typeparam>
            /// <param name="assemblyName">LoadFrom支持从一个URL加载程序集(如"http://www.abc.com/test.dll"),这个程序集会被下载到用户缓存文件夹中。</param>
            /// <param name="nameSpace">名称空间</param>
            /// <param name="className">类名</param>
            /// <returns></returns>
            public static T CreateInstanceByLoadFrom<T>(string assemblyName, string nameSpace, string className)
            {

                try
                {
                    string fullName = nameSpace + "." + className;
                    Assembly ass = Assembly.LoadFrom(assemblyName);
                    object obj = ass.CreateInstance(fullName);
                    return (T)obj;
                }
                catch
                {
                    return default(T);
                }

            }

            /// <summary>
            ///  反射获取类型
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="fullname">名称空间.类名</param>
            /// <param name="assemblyName">Dll名.dll</param>
            /// <returns></returns>
            public static Type GetType(string fullname, string assemblyName)
            {
                try
                {
                    string path = fullname + "," + assemblyName;
                    return  Type.GetType(path, true);
                }
                catch
                {
                    return null;
                }
            }
            /// <summary>
            /// 反射获取类型
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="assemblyName">必须使用全路径,此处如果只有dll名称则默认在程序启动目录下找</param>
            /// <param name="nameSpace"></param>
            /// <param name="className"></param>
            /// <returns></returns>
            public static Type getTypeByLoadFile(string assemblyName, string nameSpace, string className)
            {
                if (!assemblyName.Contains("\\"))
                {
                    assemblyName = System.Windows.Forms.Application.StartupPath + "\\" + assemblyName;
                }
                try
                {
                    string fullName = nameSpace + "." + className;
                    Assembly ass = Assembly.LoadFile(assemblyName);
                   return ass.GetType(fullName, true);
                }
                catch
                {
                    return null;
                }

            }
            /// <summary>
            ///  反射获取类型
            /// </summary>
            /// <typeparam name="T">返回类型</typeparam>
            /// <param name="assemblyName">这个参数实际上是需要加载的程序集的强名称(名称,版本,语言,公钥标记)。例如.NET 2.0中的FileIOPermission类,它的强名称是:
            ///System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</param>
            /// <param name="nameSpace">名称空间</param>
            /// <param name="className">类名</param>
            /// <returns></returns>
            public static Type GetTypeByLoad(string assemblyName, string nameSpace, string className)
            {

                try
                {
                    string fullName = nameSpace + "." + className;
                    Assembly ass = Assembly.Load(assemblyName);
                    return ass.GetType(fullName, true);
                }
                catch
                {
                    return null;
                }

            }
            /// <summary>
            ///  反射获取类型
            /// </summary>
            /// <typeparam name="T">返回类型</typeparam>
            /// <param name="assemblyName">LoadFrom支持从一个URL加载程序集(如"http://www.abc.com/test.dll"),这个程序集会被下载到用户缓存文件夹中。</param>
            /// <param name="nameSpace">名称空间</param>
            /// <param name="className">类名</param>
            /// <returns></returns>
            public static Type GetTypeByLoadFrom(string assemblyName, string nameSpace, string className)
            {

                try
                {
                    string fullName = nameSpace + "." + className;
                    Assembly ass = Assembly.LoadFrom(assemblyName);
                    return ass.GetType(fullName,true);
                }
                catch
                {
                    return null;
                }

            }
        }
    }

    取得type以后可以使用反射相应的方法来实例化:例如object o = Activator.CreateInstance( type )

  • 相关阅读:
    [android] 获取系统的联系人信息
    [android] 内容观察者
    [nodejs] nodejs开发个人博客(六)数据分页
    [android] 插入一条记录到系统短信应用里
    [android] 短信的备份
    [android] 内容提供者实现
    [android] 内容提供者简介
    [nodejs] nodejs开发个人博客(五)分配数据
    [android] 常用数据适配器SimpleAdapter
    [android] 常用数据适配器ArrayAdapter
  • 原文地址:https://www.cnblogs.com/gfjin/p/8084460.html
Copyright © 2011-2022 走看看