初入反射

1.第一天写博客,心中只有一个念头呀,就是要坚持写下去,把自己的学习心得都给写上去。第一次写,可能写得不好,还希望大家能够理解哈~ 第一次给大家分享下反射!


            // Assembly assembly = Assembly.Load("StudyReflexTest"); //1.需要引用DLL才能加载,不必加后缀名

            // Assembly assembly = Assembly.LoadFrom("StudyReflexTest"); //2.也需要引用DLL,但必须加后缀名

            Assembly assembly = Assembly.LoadFile(@"E:\Study\反射\StudyReflex\StudyReflexTest\bin\Debug\StudyReflexTest.dll");  //这种不需要引用DLL,但是需要DLL的绝对路径

            foreach (var item in assembly.GetModules())
            {
                //Console.WriteLine(item.Name);

            }
            foreach (var type in assembly.GetTypes())  /// 获取DLL下定义的类型
            {
                //Console.WriteLine(type.Name);  //类型名称
                foreach (var item in type.GetMethods())  //获取DLL定义的类型下的各种方法属性不能获取到字段
                {
                    Console.WriteLine(item.Name);
                }
            }

            var newType = assembly.GetTypes();

            foreach (var item in newType)
            {
                object CreateDb = Activator.CreateInstance(item);// 1.根据DLL下的定义的类型创建了OBJ的对象,
                                                                 // 由于我们可能并不知道这个类型是什么类型。
                                                                 // 所以我们这个时候要解决这个问题就是给那个程序集下所定义的类弄一个接口,然后类型转换的话,直接转成接口应该就好啦

                var newCreate = CreateDb as IReflexTest;      //  这个地方遇到一共小坑, 由于我那个DLL没有编译,所以就导致了这个被转成接口类型的类为NULL所以就出现未将对象引用到实例的错误!


                newCreate.TestShow(); // 这个时候就能看到这个方法啦~
            }

今天学习一波简单工厂的反射,实在太简单,看看就明白了~~ 希望各位大佬轻点喷,我就是写给自己看看的,如果有问题还希望各位大佬能够及时帮帮我,谢谢大家, 废话不多说,我直接贴代码啦!


下图是调用工厂类的方法:

{
                Console.WriteLine("*****************************简单工厂反射***********************************************");
                SimpleFactory simple = new SimpleFactory();

                IReflexTest iReflex= simple.CreateIReflexTest();


                iReflex.TestShow();           
            }

下图是工厂的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Configuration;
using StudyReflexInterfaceTest;
using System.Reflection;
namespace StudyReflex
{
    public class SimpleFactory
    {
        private static string TypeDll = ConfigurationManager.AppSettings["IDBHelper"].ToString();

        private static string dllName = TypeDll.Split(',')[1]; //获取dll名字 用于加载

        private static string TypeName = TypeDll.Split(',')[0]; //获取类型名字,用来获取类型

        public IReflexTest CreateIReflexTest()
        {
            var assembly= Assembly.Load(dllName);  //读取到DLL


            Type newType = assembly.GetType(TypeName); // 获取到这个类型

            IReflexTest iReflex = Activator.CreateInstance(newType) as IReflexTest;  //创建这个类并且直接转成类型所实现的这个接口。

            return iReflex;  // 返回这个接口

        }
    }
}

下面就是配置文件的代码:

  <appSettings>


    <add key="IDBHelper" value="StudyReflexTest.Test,StudyReflexTest" />
    
  </appSettings>


这个简单工厂的代码逻辑就是,在配置文件中动态写入需要反射的DLL的名字和DLL下面要反射的类型(注意:这个类型 必须实现一个接口!)  然后在新建一个工厂,读取到这个类型和DLL 然后在将类型创建出来,转成我们的实现的接口类型,返回出去,这样我们就能够通过反射调用到那个类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值