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();
  • 相关阅读:
    Raid磁盘阵列更换磁盘时另一块盘离线恢复案例(v7000存储数据恢复)
    服务器SQL server数据库被加密恢复方案
    Vsan分布式文件系统逻辑架构损坏恢复过程
    Linux服务器数据恢复案例,服务器瘫痪数据恢复成功
    数据库执行truncate table CM_CHECK_ITEM_HIS
    服务器ocfs2文件系统被误格式化的数据恢复过程
    内蒙古某公司XFS文件系统服务器数据恢复报告
    关于vsan分布式服务器数据恢复成功案例分享
    北京某公司存储数据恢复成功案例;存储崩溃数据恢复方法
    IBM X3850服务器数据恢复成功案例
  • 原文地址:https://www.cnblogs.com/XZhao/p/6933419.html
Copyright © 2011-2022 走看看