zoukankan      html  css  js  c++  java
  • 反射笔记

    反射概念

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

    练习代码

    一个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。

  • 相关阅读:
    最快的csv文件入到数据库的方法
    (转)CString,int,string,char*之间的转换
    多线程实现
    同时取得架构和表名
    (转)颠覆你对方法调用的看法!
    TabControl控件和TabPage
    GridControl事件
    SharpICTCLAS分词系统简介
    idea maven新建struts2项目
    servlet-mysql实现简单用户登录注册
  • 原文地址:https://www.cnblogs.com/xqhppt/p/2047982.html
Copyright © 2011-2022 走看看