工厂里的那些事

在机房重构的时候工厂层里面的东西都是些没有见过的,所以查了一下资料,总结一下。

System.Reflection(命名空间)

System.Reflection 命名空间包含通过检查托管代码中程序集、模块、成员、参数和其他实体的元数据来检索器相关信息的类型。这些类型还可用于操作加载类型的实例,例如挂钩事件或调用方法。若要动态创建类型,请使用System.Reflection.Emit 命名空间。

CType函数

CType函数作用于两个参数。第一参数是将要转换的表达式,第二个参数是目标类型或对象类。注意,第一个参数必须是表达式,不能是类型。

CType函数是一个内联函数,这意味着转换是由已编译的代码执行的,通常不会生成函数调用,这将提高性能。

语法:

CType(expression,typename)

说明:
expression
任何有效的表达式。如果expression的值超出typename允许的范围,将引发异常。
typename
任何在Dim语句的As子句内合法的表达式,即任何数据类型、对象、结构、类或接口的名称。
CType采用内联方式编译,即转换代码是计算表达式的代码的一部分。在某些情况下不调用过程完成转换,使执行更快。
如果转换不会从expression定义到typename,Visual Basic显示生成时错误消息。

<span style="font-size:18px;">Public Function CreateUserInfo() As IuserinfoDAL
        'CType是一个内联函数,将前部分的表达式转换为后面的类型  
        Return CType(Assembly.Load("LoginDAL").CreateInstance("LoginDAL" & "." & "LoginUserDAL"), IuserinfoDAL)      
    End Function</span>

反射

在.NET Framework中反射

System.Reflection 命名空间中的类与 System.Type 使你能够获取有关加载的程序集和其中定义的类型的信息,如类、接口和值类型。可以使用反射在运行时创建、调用和访问类型实例。有关反射的特定方面的主题,请参见本概述末的相关主题。
公共语言运行时程序管理应用程序域,应用程序域构成具有相同应用程序范围的对象周围定义的边界。此管理包括将每个程序集加载到相应的应用程序域中和控制每个程序集内的类型层次结构的内存布局。
程序集包含模块、模块包含类型,而类型包含成员。反射提供封装程序集、模块和类型的对象。可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。然后,可以调用类型的方法或访问其字段和属性

机房中的发射

在机房重构中我们用到了Assembly,所以这里主要说一下Assembly。
使用Assembly定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。

<span style="font-size:18px;">Public Function CreateUserInfo() As IuserinfoDAL
        'CType是一个内联函数,将前部分的表达式转换为后面的类型  
        Return CType(Assembly.Load("LoginDAL").CreateInstance("LoginDAL" & "." & "LoginUserDAL"), IuserinfoDAL)      
    End Function</span>

Assembly.Load(AssemblyName)这个方法是动态加载程序集,.CreateInstance(className)方法则是创建类的实例

优点:

1、反射提高了程序的灵活性和扩展性

 2、降低耦合性,提高自适应能力

3、它允许程序创建和控制任何类的对象,无需提前硬编码目标类

缺点:

1、性能问题:使用发射基本上是一种解释操作,用于字段和方法接入时要远慢于直接代码。因此发射机制主要应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。

2、使用反射会模糊程序内部逻辑;程序员希望在源代码中看到程序的逻辑,发射却绕过了源代码的技术,因而会带来维护的问题,发射代码比相应的直接代码更复杂。


你可能感兴趣的:(工厂里的那些事)