反射的描述是这样的:
反射提供了封装程序集、模块和类型的对象。我们可以使用反射动态地创建类型的实例,将类型绑定到现有对象或从现有对象中获取类型,然后调用类型的方法或访问其字段和属性。反射:不就是在对象中加载程序集,同时访问程序集中的类型和方法吗?怎么还“动态地创建类型的实例”,这个动态,怎样理解,和直接初始化对象有什么不同吗?为什么起名叫反射,怎样理解这两个字,就是在程序中加载其它程序集直接在程序中添加程序集的引用不也一样吗???有点理解不了,迷糊???
反射提供了封装程序集、模块和类型的对象。我们可以使用反射动态地创建类型的实例,将类型绑定到现有对象或从现有对象中获取类型,然后调用类型的方法或访问其字段和属性。反射:不就是在对象中加载程序集,同时访问程序集中的类型和方法吗?怎么还“动态地创建类型的实例”,这个动态,怎样理解,和直接初始化对象有什么不同吗?为什么起名叫反射,怎样理解这两个字,就是在程序中加载其它程序集直接在程序中添加程序集的引用不也一样吗???有点理解不了,迷糊???
举个例子,比如说要做个插件,怎么做
主程序里要定义个接口公布出来,插件程序实现这个接口,把插件程序集放到指定目录
主程序就需要用反射把各个插件的dll加载进来,然后转换成接口并调用
IA a = new A(); 这样的代码一旦编译成为dll,除非改代码,否则a永远是A的实例。
但如果用反射,我们可以:
IA a = (IA)Activator.CreateInstance("B");即创建实例的地方变成字符串,这个字符串又可以通过种种方式拿到程序外部,
比如:配置文件,数据库,用户输入。
这样 a 就有可能不需要修改代码,重新编译就可以指向不同的实例。
/// 创建指定类型(接口,抽象类)的实例
/// </summary>
/// <typeparam name="T">指定类型(接口,抽象类)</typeparam>
/// <param name="providerAssembly">提供程序的程序集名称</param>
/// <param name="providerType">类型的完整名称</param>
/// <returns></returns>
public T CreateInstance<T>(string providerAssembly, string providerType)
{
Assembly assembly = Assembly.Load(providerAssembly);
object provider = assembly.CreateInstance(providerType); if (provider is T)
{
return (T)provider;
}
else
{
throw new InvalidOperationException("当前指定的的提供程序不是当前类型具体实现类");
}
}
PDF.NET数据开发框架可以通过反射创建具体的数据访问对象,比如新增一个Sysbase数据库,只要继承了系统的抽象数据访问接口,使用反射,系统就有了访问Sysbase数据库的能力了。