• NET基础学习笔记11---反射


    反射

    反射:就是动态获取程序集中的元数据来操作类型的。

     1 using System;
     2 using System.Collections.Generic;
     3 using System.Linq;
     4 using System.Text;
     5 using System.Reflection;
     6 
     7 namespace 反射的应用获取dll
     8 {
     9     class Program
    10     {
    11         static void Main(string[] args)
    12         {
    13             #region 1加载指定的程序集,并获取该程序集中的所以的类型
    14             //Assembly asm = Assembly.LoadFrom("TestReflect.dll");
    15             //Type[] types = asm.GetTypes();
    16             //foreach (Type typeitem in types)
    17             //{
    18             //    Console.WriteLine(typeitem.Name);
    19             //}
    20             //Console.WriteLine("---------------------------------------------------------------");
    21             //Type[] types2 = asm.GetExportedTypes();
    22             //foreach (Type type2item in types2)
    23             //{
    24             //    Console.WriteLine(type2item.Name);
    25             //}
    26             #endregion
    27 
    28             #region 2获取加载程序集,获取Class1下的所以的方法
    29             //Assembly asb = Assembly.LoadFrom("TestReflect.dll");
    30             //Type classtype = asb.GetType("TestReflect.Class1");
    31 
    32             //MethodInfo[] Methods= classtype.GetMethods();
    33             //foreach (MethodInfo Methoditem in Methods)
    34             //{
    35             //    Console.WriteLine(Methoditem.Name);
    36             //}
    37             #endregion
    38 
    39             #region 3获取加载程序集,调用Class1下的所以的方法
    40             Assembly asb = Assembly.LoadFrom("TestReflect.dll");
    41             Type classtype = asb.GetType("TestReflect.Class1");
    42             object obj = Activator.CreateInstance(classtype);
    43 
    44             MethodInfo Methods = classtype.GetMethod("getName");
    45             Console.WriteLine(Methods.Invoke(obj, new object[] { "小庄" })); 
    46             
    47             #endregion
    48 
    49             Console.ReadKey();
    50         }
    51     }
    52 }
    View Code

    1.获取程序集

    Assembly asm=Assembly.LoadFrom("路径");

    asm.GetTypes();获取程序集里面的所以类型。

    asm.GetExportedTypes();获取程序集里面的所以公有类型。

    Type classtype = asm.GetType("命名空间.类型名称")获取指定的类型。

    classtype.GetMethods();获取类型里面的所以方法。

    object obj=Activator.CreateInstance(classtype);创建这个类型的对象。

    MethodInfo Methods=classtype.GetMethod("方法名称");获得类型里面的方法。

    Methods.Invoke(obj,new object[]{});调用方法。传入类型和参数数组。

    调用Private里面的方法

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Reflection;
    
    namespace _1调用private方法
    {
        class Program
        {
            static void Main(string[] args)
            {
                Type PersonType = typeof(Person);
                object obj = Activator.CreateInstance(PersonType);
                //调用private成员要添加BindingFlags.NonPublic | BindingFlags.Instance 不然会获取不到方法。
                MethodInfo info = PersonType.GetMethod("SayHi",BindingFlags.NonPublic|BindingFlags.Instance);
                info.Invoke(obj, null);
                Console.ReadKey();
            }
        }
    
        public class Person
        {
            private void SayHi()
            {
                Console.WriteLine("hi");
            }
        }
    }
    调用private方法

    扩展方法的使用(一般不建议使用)

    扩展方法的步骤:

    1.创建静态类。

    2.创建静态方法。

    3.产生关联,

    如:Public bool IsEmail(this string msg)

    第一个参数,代表这个方法产生关联

    第二个参数,关联对象,就是一个类型(string),msg是实体。

  • 相关阅读:
    java web前端发送请求的4种方式
    简单的jQuery前端验证码校验
    验证码实现原理
    Objective-C的内存管理(一)黄金法则的理解
    UIview层次管理
    IOS设置图片背景
    Google Code Jam 2014 Round 1 A:Problem C. Proper Shuffle
    Google Code Jam 2014 Round 1 A:Problem B. Full Binary Tree
    Google Code Jam 2014 Round 1 A:Problem A Charging Chaos
    UVA 10209
  • 原文地址:https://www.cnblogs.com/huijie/p/3362574.html
Copyright © 2020-2023  润新知