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 然后在将类型创建出来,转成我们的实现的接口类型,返回出去,这样我们就能够通过反射调用到那个类型。