zoukankan      html  css  js  c++  java
  • 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();
  • 相关阅读:
    Git命令家底儿及Git数据通信原理详解
    git SSH keys
    TRIM函数
    c# List AddRange
    vtk第一个程序
    MFC CStatic类动态创建
    前端基础之BOM和DOM
    JavaScript
    前端CSS属性相关
    前端CSS
  • 原文地址:https://www.cnblogs.com/XZhao/p/6933419.html
Copyright © 2011-2022 走看看