反射
反射可以获取到一个dll或者exe文件中的方法、属性、字段等信息。利用反射可以实现动态创建类的实例,通过assembley的路径和类的全名称(这两个string字符串)就可以创建类的实例。
优点:
1.使用了反射,可以不需要重新编译文件,直接替换相应的dll文件就可以完成程序的升级和更新;
2.利用反射和配置文件,将Assembly的路径和类的全名称或者类的命名空间存放在config文件中,这样就可以实现动态的创建类的实例,可以实现功能随意增删改的软件,大大提高让软件的可扩展性。
缺点:
性能比较差
反射的两个重要的类System.Reflection和System.Type,Type类是反射的核心类,它可以获取到一个类中的所有的信息。
类库Study.dll
1 namespace Study
2 {
3 public class Study
4 {
5 private string language;
6 public string Language { get; set; }
7
8 public void StudyLanuage(string lan)
9 {
10 Console.WriteLine("I am study " + lan);
11
12
13 }
14
15 private void Hello()
16 {
17 Console.WriteLine("师姐你好");
18 }
19 }
20 }
1.System.Reflection(通过Assembly的CreateInstance创建类的实例然后调用相应的方法)
可以使用Assembly获取到Study.dll类库,然后动态的创建出Study类的实例,调用相应的方法。
1 string assemblyPath = "Study";
2 Assembly asm = Assembly.Load(assemblyPath);
3 IStudy instance = asm.CreateInstance("Study.Study") as IStudy;
4 instance.StudyLanguage("english");
上面的代码解决了上层对于下层的依赖关系,直接面向接口编程,当需要升级或者改动的时候,直接替换掉Study.dll类库,不需要重新编译。
2.System.Type(通过Type的Activator的CreateInstance方法)
string assemblyPath = "Study";
Assembly asm = Assembly.Load(assemblyPath);//Type type = Type.GetType("Study.Study");
Type type = asm.GetType("Study.Study");
IStudy instance= Activator.CreateInstance(type) as IStudy;
instance.StudyLanguage("Chinese");
值得注意的是,上面的Type.GetType来获取类型的时候,得到的结果是null,所以使用Assembly的实例进行获取,从而可以得知Type.GetType方法的作用范围仅仅是当前的程序集,由于Study.dll与主程序不在同一个程序集中,所以无法获取Type。
上面的两种方式分别动态创建实例,实现了架构的解耦,同时可以进一步将AssemblyPath和NameSpacePath放置在.config文件中,动态的读取
3.Type的再研究
Type的获取方式
1.通过typeof
2.Type.GetType(string class),在同一个程序集下
3.instance.GetType()
1 static void Main(string[] args)
2 {
3 Study.Study study = new Study.Study();
4 string s1 = study.GetType().ToString();
5 string s2 = (typeof (Study.Study)).ToString() ;
6 string s3=Type.GetType("System.String").ToString();
7 Console.WriteLine(s1);
8 Console.WriteLine(s2);
9 Console.WriteLine(s3);
10 Console.Read();
11 }
Type获取dll中类的信息,方法,属性,字段等
比较常用的有GetMethods、GetMembers、GetFields等
1 Assembly asm = Assembly.LoadFrom(@"E:MyDocumentReflectionPracticeReflectionPracticeinDebugStudy.dll");
2
3 Type t= asm.GetType("Study.Study");
4 object obj= Activator.CreateInstance(t);
5 MethodInfo method= t.GetMethod("StudyLanguage");
6 method.Invoke(obj, new[] {"英语"});
7 Console.ReadKey();