提到.NET,我们不得不说到一个很重要的概念——反射。说白了,反射实际上就是得到程序集中的属性和方法。在 运行时检查和处理程序元素 的功能.
例如如下功能:1、枚举类型的成员;2、实例化新对象;3、执行对象的成员;4、查找类型的信息;5、查找程序集的信息;6、检查应用于类型的定制特性;7、创建和编译新程序集.
反射的具体实现步骤如下:
【1】导入using System.Reflection;
【2】Assembly.Load("程序集")加载程序集,返回类型是一个Assembly
【3】foreach (Type type in assembly.GetTypes())
{
string t = type.Name;
}
得到程序集中所有类的名称
【4】Type type = assembly.GetType("程序集.类名"); 获取当前类的类型
【5】Activator.CreateInstance(type); 创建此类型实例
【6】MethodInfo mInfo = type.GetMethod("方法名"); 获取当前方法
【7】mInfo.Invoke(null,方法参数);
**********************************************************************************************************
【《实例》】
1、引入命名空间:
using System;
using System.Reflection;
using System.Configuration;
using IDAL;
2、利用反射,在配置文件里定义好类型名,在程序运行时动态创建对象。调高了灵活性,但会有性能损失
在web.config文件中定义:
<appSettings>
<add key="DAL" value="SQLServerDAL"/>
</appSettings>
3、
using System;
using System.Reflection;
using System.Configuration;
using IDAL;
namespace Factory
{
/// <summary>
/// 抽象工厂模式创建DAL。
/// web.config 需要加入配置:(利用工厂模式+反射机制+缓存机制,实现动态创建不同的数据层对象接口)
///
/// 工厂模式 + 反射机制 + 缓存机制
///
/// DataCache类在导出代码的文件夹里
/// 利用反射,在配置文件里定义好类型名,在程序运行时动态创建对象。调高了灵活性,但会有性能损失
/// <appSettings>
/// <add key="DAL" value="SQLServerDAL" /> (这里的命名空间根据实际情况更改为自己项目的命名空间)
/// </appSettings>
/// </summary>
public sealed class DataAccess
{
//这个类里使用了反射
private static readonly string AssemblyPath = ConfigurationManager.AppSettings["DAL"];
/// <summary>
/// 创建对象或从缓存获取
/// </summary>
public static object CreateObject(string AssemblyPath, string ClassNamespace)
{
object objType = DataCache.GetCache(ClassNamespace); //从缓存读取
if (objType == null)
{
try
{
objType = Assembly.Load(AssemblyPath).CreateInstance(ClassNamespace);//反射创建
//DataCache.SetCache(ClassNamespace, objType);// 写入缓存
}
catch
{
}
}
return objType;
}
}