C#通过反射动态加载dll,读取module、类、方法、特性,并通过反射+简单工厂+配置文件 实现ioc

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41660162/article/details/79837991

调用类:

class Program
{
    static void Main(string[] args)
    {
        SafeInvoke(() =>
        {//通过委托实现通用的异常处理
            #region 通过反射创建对象
            {
                //1 动态加载     默认加载当前路径的dll文件,不需要后缀
                Assembly assembly = Assembly.Load("Work.DB.Sqlserver");
                Assembly assembly1 = Assembly.LoadFile(@"E:\winningjob\C#workspace\Projects\MyHomeWork\Work.DB.Sqlserver\bin\Debug\Work.DB.Sqlserver.dll");
                Assembly assembly2 = Assembly.LoadFrom("Work.DB.Sqlserver.dll");// 可以是当前路径  也可以是完整路径


                //2 获取类型 (获取类型信息的方式不止一个)
                Type typeDBHelpher = assembly.GetType("Work.DB.Sqlserver.DBHelper");


                //3 创建对象 
                object oDBHelper = Activator.CreateInstance(typeDBHelpher);


                //4 调用方法 实例方法、静态方法、重载方法 选修:调用私有方法 调用泛型方法
                {//无参数
                    MethodInfo method = typeDBHelpher.GetMethod("Show");
                    method.Invoke(oDBHelper, null);
                }
                {//有参数
                    MethodInfo method = typeDBHelpher.GetMethod("MxdQuery");
                    method.Invoke(oDBHelper, new object[] { "测试入参" });
                }
                {//泛型参数
                    MethodInfo method = typeDBHelpher.GetMethod("ShowGeneric");
                    method = method.MakeGenericMethod(typeof(string));//如果是泛型方法,那么需要先制定参数的类型
                    method.Invoke(oDBHelper, new object[] { "测试入参" });
                }
                {//当需要获取的方法有重载方法的时候,获取方法时需要指定参数顺序和类型
                    MethodInfo method = typeDBHelpher.GetMethod("Show_重载", new Type[] { });
                    method.Invoke(oDBHelper, null);


                    MethodInfo method1 = typeDBHelpher.GetMethod("Show_重载", new Type[] { typeof(string) });
                    method1.Invoke(oDBHelper, new object[] { "测试入参" });
                }
            }
            #endregion
            Console.WriteLine("*************************************************");
            #region 创建对象 反射+简单工厂+配置文件 ioc
            {
                  //IDBHelper oDBHelperFactory = SimpleFactory.CreatDBHelper();
                  var oDBHelperFactory = SimpleFactory.CreatDBHelper<IDBHelper>();
                  oDBHelperFactory.QueryEntity<User>(1);//这里是测试根据Id获取一行数据
                  oDBHelperFactory.QueryEntityList<Company>();//这里测试获取模型表的所有数据
            }
            #endregion 
        });         
    }
	/// <summary>
	/// 通用的异常处理
	/// </summary>
	/// <param name="act">对应任何的逻辑</param>
	public static void SafeInvoke(Action act)
	{
		try
		{
		  act.Invoke();
		}
		catch (Exception ex)//按异常类型区分处理
		{
		  Console.WriteLine(ex.Message);
		}
	}  
}

简单工厂类:

class SimpleFactory
{
    //获取配置文件中的数据库连接字符串
    private static string IDBHelperConfig = ConfigurationManager.AppSettings["IDBHelper"];
    private static string dllName = IDBHelperConfig.Split(',')[1];
    private static string className = IDBHelperConfig.Split(',')[0];

    public static T  CreatDBHelper<T>()
    {
        if (true)//方式一
        {
            //1 动态加载
            Assembly assembly = Assembly.Load(dllName);
            //2 获取类型
            Type typeDBHelper = assembly.GetType(className);
            //3 创建对象
            object oDBHelper = Activator.CreateInstance(typeDBHelper);
            //4 类型转换
            return (T)oDBHelper;
        }
        else//方式二
        {
            return (T)Activator.CreateInstance(dllName, className).Unwrap();
        }

    }
}

猜你喜欢

转载自blog.csdn.net/weixin_41660162/article/details/79837991