美文网首页
C#反射基础介绍

C#反射基础介绍

作者: 无为无味无心 | 来源:发表于2018-11-05 11:07 被阅读0次

    1.什么是反射

    1.在内存中操作一个程序集,在运行的过程中无法进行调试
    2.程序集是编译器生成的,程序集里面有中间代码(MSIL),让即时编译器用的(CLR),再交给机器码,再加给CPT运行
    3.解耦
    4.元数据:描述此程序集中有哪些类,类中有哪些成员,不包括具体的方法体。描述一个程序集的清单
    5.现个进程为什么不能访问,是因为通过应用程序域来管理的
    

    2.为什么需要反射

    答:在项目中不能添加程序集(dll),但是又要在项目中调用.dll程序集中某个类中的方法,属性,字段...这种需要可以使用反射来操作
    

    1.加载程序集的几种方式

    1.自动扫描当前运行项目的bin\debug ,网站是扫描bin目录 下的Lib.dll程序集 (常用)
    1.Assembly.Load("Lib");
    2.指定一个绝对路径加载程序集
    1.Assembly.LoadFile
    2.Assembly.LoadFrom
    3.获得当前 程序域中 所有的Assembly,包括GAC中的程序集
    1.AppDomain.CurrentDomain.GetAssemblies();
    4.可以直接通过this来获取
    1.this.GetType().Assembly;
    5. typeof(Form1).Assembly

    2.获取类的几种方式

    1.获取指定类的类型 ass.GetType("Lib.Pig");
    2.获取当前所有的类(包括公有和非有) ass.GetTypes();
    3.忽略类的全名的大小写 ass.GetType("Lib.pig", false, true);
    4.可以typeof()关键字来获取 typeof(Form1);
    5.可以通过实例的GetType()
    Type type5 = this.GetType(); Form1 f1 = new Form1(); Type type6 = f1.GetType();

    3.操作类中的字段

    1.获取私有字段

    pigtype.GetField("_name", BindingFlags.NonPublic | BindingFlags.Instance);
    BindingFlags.NonPublic | BindingFlags.Instance:表示获取一个非共有的实例字段,一定是组合使用
    BindingFlags.NonPublic | BindingFlags.Static:表示获取一个非共有的静态字段 ,一定是组合使用
    ####2.给_name字段赋值
    object instance = ass.CreateInstance("Lib.Pig");
    nameInfo.SetValue(instance, "八戒");

    3.获取instance中的_name字段值

            object retVal = nameInfo.GetValue(instance);
            MessageBox.Show(retVal.ToString());
    

    4.操作类的方法

    1.获取方法
        pigType.GetMethod("Eat", BindingFlags.Public | BindingFlags.Instance);
    2.调用方法
        mInfo.Invoke(instance, new object[] { "八戒", 500 });
    

    5.实例化对象

    1.     Assembly ass = Assembly.Load("Lib");
         ass.CreateInstance("Lib.Pig");
    2.     Type pigType = ass.GetType("Lib.Pig");
         Activator.CreateInstance(pigType);//要求:必须要求类拥有无参的构造函数,否则报错
    3.     ConstructorInfo cinfo = pigType.GetConstructor(new Type[] { typeof(string) });
        object pigInstance = cinfo.Invoke(new object[] { "八戒11" }); //new Pig("八戒",500)
    4.    /获取pigInstance中的Name的值
        PropertyInfo nameInfo = pigType.GetProperty("Name");
         object res = nameInfo.GetValue(pigInstance)
    

    6.Type类型中重要方法

    Assembly ass = Assembly.Load("Lib");
    Type pigType = ass.GetType("Lib.Pig");
    
    //获取程序集的绝对路径
    //pigType.Assembly.Location
    //pigType .FullName  //Lib.Pig
    //pigType.Name// Pig
    
    //1.0 判断Pig类是否实现了Ipig接口
    //1.0.1 获取IPig接口的Type
    Type ipigType = ass.GetType("Lib.IPig");
    //1.0.2 判断pigType是否实现了ipigType
    bool isok = ipigType.IsAssignableFrom(pigType);  //true
    
    //2.0 判断Pig类是否继承了Basepig类
    Type basepigType = ass.GetType("Lib.BasePig");
    bool isext = pigType.IsSubclassOf(basepigType); //true
    
    //3.0 object instance=new Pig();
    object instance = ass.CreateInstance("Lib.Pig");
    pigType.IsInstanceOfType(instance); //true
    

    相关文章

      网友评论

          本文标题:C#反射基础介绍

          本文链接:https://www.haomeiwen.com/subject/npojxqtx.html