C#之反射

反射

反射可以获取到一个dll或者exe文件中的方法、属性、字段等信息。利用反射可以实现动态创建类的实例,通过assembley的路径和类的全名称(这两个string字符串)就可以创建类的实例。

优点

1.使用了反射,可以不需要重新编译文件,直接替换相应的dll文件就可以完成程序的升级和更新;

2.利用反射和配置文件,将Assembly的路径和类的全名称或者类的命名空间存放在config文件中,这样就可以实现动态的创建类的实例,可以实现功能随意增删改的软件,大大提高让软件的可扩展性。

缺点

性能比较差

反射的两个重要的类System.ReflectionSystem.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();
原文地址:https://www.cnblogs.com/XZhao/p/6933419.html