• 反射笔记


    反射概念

       反射则提供了封装程序集、模块和类型的对象。您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。

    练习代码

    一个Apple类

    Apple 类
    namespace Arithmetic
    {
    public class Apple
    {
    public void SayApple()
    {
    Console.WriteLine(
    "Hi Apple!");
    }
    }
    }

    一个Program类

    Program 类
    namespace Arithmetic
    {
    class Program
    {
    static void Main(string[] args)
    {

    }
    }
    }

    一个Common类库

      练习将使用反射动态实例化一个Apple类,调用Apple里的方法和加载外部程序集并调用其中的方法。本随笔只是做为练习反射的一个记录,并不是实际应用,对于反射实际应用应该根据自己的具体环境来。

      首先需要先获取当前执行的程序集

      //加载当前执行的程序集
    Assembly assembly = Assembly.GetExecutingAssembly();

      然后获取该程序集下定义的类型,可以直接获取该类或获取全部类,然后再找出自己需要的类。然后实例化

    View Code
    //直接获取apple类 名称必须是全名 命名空间+类名
    //Type type = assembly.GetType("");

    //获取所有程序集下定义的类
    Type[] types = assembly.GetTypes();
    Apple apple
    = null;

    foreach (Type t in types)
    {
    if (t.Name == "Apple")
    {
    //实例化
    apple = (Apple)assembly.CreateInstance(t.FullName);
    //调用实例化后的方法
    apple.SayApple();
    }
    }

      反射调用方法

    View Code
    //反射调用方法
    MethodInfo m = assembly.GetType("Arithmetic.Apple").GetMethod("SayApple");
    m.Invoke(apple,
    null);

      上面反射是调用同一个程序集里面的东西,如果是不同的程序集,那需要先加载外部的程序集

    View Code
    //加载外部程序集
    Assembly commonAssembly = Assembly.Load("Common");
    //string path = System.IO.Path.Combine(Environment.CurrentDirectory, "Common.dll");
    //Assembly commonAssembly = Assembly.LoadFrom(path);
    Console.WriteLine("被加载程序集全名:{0}", commonAssembly.FullName);

      当加载完成后,反射实例、方法同上面一样

    View Code
    //反射调用方法
    object obj = commonAssembly.CreateInstance("Common.Utility.RegexHelper");
    MethodInfo commonMethod
    = obj.GetType().GetMethod("IsChineseCharacters");
    object result = commonMethod.Invoke(obj, new object[] {"1"});
    Console.WriteLine(result);

      一个简单的分析Common程序集的代码

    View Code
    //反射调用方法
    object obj = commonAssembly.CreateInstance("Common.Utility.RegexHelper");
    MethodInfo commonMethod
    = obj.GetType().GetMethod("IsChineseCharacters");
    object result = commonMethod.Invoke(obj, new object[] {"1"});
    Console.WriteLine(result);

    Console.WriteLine(
    "================分析反射加载程序集Common的内容================");
    AssemblyName commonName
    = commonAssembly.GetName();

    Console.WriteLine(commonName.Name);
    Type[] commonTypes
    = commonAssembly.GetTypes();

    for (int i = 0; i < commonTypes.Length; i++)
    {
    Type t
    = commonTypes[i];
    Console.WriteLine(
    "┄{0}", t.Namespace);
    Console.WriteLine(
    "┄┄{0}", t.Name);

    foreach (MethodInfo item in t.GetMethods())
    {
    Console.WriteLine(
    "┄┄┄{0}", item.Name);
    }
    }

      

      关于反射更详细的内容可以参考MSDN。

  • 相关阅读:
    firefox ajax async 弹出窗口提示阻止
    Spring加载resource时classpath*:与classpath:的区别(转)
    超链接的href属性 js调用
    jquery easyui tabs layout 记录
    PostgreSQL 中的递归查询 与oracle 的比较
    将字符串中的中文(英文)字符串转化为阿拉伯数字
    用CSS控制文字的宽度,超过省略号代替(转)
    制作gridview 固定列的2种简单解决方案
    自制树型控件(DataGrid) 支持多种响应
    备忘: select 对象的操作js(转)
  • 原文地址:https://www.cnblogs.com/xqhppt/p/2047982.html
Copyright © 2020-2023  润新知