(PetShop.IDAL.ICategory)Assembly.Load("PetShop.SQLServerDAL").CreateInstance("PetShop.SQLServerDAL.Category");
分析这句代码:
- (PetShop.IDAL.ICategory)强类型转换
- Assembly类,可以加载程序集、浏览程序集的元数据和构成部分、发现程序集中包含的类型以及创建这些类型的实例。
- Assembly.Load()方法,加载程序集
- CreateInstance,从加载的程序集中查找某个类型,并创建它的实例,就是被强类型转换的对象。
这种用法是利用反射编程的一种常见用法,此外,Assembly类还有一些方法:
- GetName(),获取此程序集的AssemblyName(完整描述该程序集的唯一标识);
- GetModule(String),获取该程序集中的指定模块;
- GetModules(),获取作为此程序集的一部分的所有模块;
- GetType(),获取当前实例的类型;
- GetType(string),获取程序集实例中具有指定名称的Type对象。
- GetTypes,获取此程序集中定义的所有类型,是一个类型数组。
- LoadModul(String, Byte[]),加载此程序集的内部模块。
- ToString(),返回程序集的全名,即所谓的显示名称。
具体用法实例如下:
- int majorVersion=typeof(WebbHelper).Assembly.GetName().Version.Major; //获取当前程序集WebbHelper版本信息
- Stream stream=typeof(WebbHelper).Assembly.GetMainfestResourceStream(fullFileName); //获取当前程序集中的资源字节数组
利用反射实现控件数组的功能:现如今在一个webform上有10个TextBox,分别命名为textbox1,textbox2,……textbox10,想一次获取他们的值或对它们赋值,而不想写10次,用下面的方法:
for(int i=1;i<=10;i++)
{
object o=this.GetType().GetField("textbox"+i.ToString(),BindingFlags.Instance|BindingFlags.NonPublic).GetValue(this);
TextBox text=(TextBox)o;
text.Text="你好"; //这样通过循环,实现了对这10个TextBox控件的赋值
}
解释下,
- this.GetType(),获取当前的窗体类(Page)
- GetField("textbox"+i.ToString(),BindingFlags.Instance|BindingFlags.NonPublic),在Page类当中获取名称为"textbox"+i.ToString()的实例(控件),实际上是通过搜索当前窗体类,BindingFlags.Instance|BindingFlags.NonPublic就是指定搜索的条件。
- GetValue(this),其实就是获取该实例的所有信息(属性、方法)
这种方法非常实用,可以在很大程度上优化我们的代码。