zoukankan      html  css  js  c++  java
  • 什么是反射

    25.什么是反射?
    答:


    反射,Reflection,通过它我们可以在运行时获得各种信息,如程序集、模块、类型、字段、属性、方法和事件

    通过对类型动态实例化后,还可以对其执行操作

    简单来说就是用string可以在runtime为所欲为的东西,实际上就是一个.net framework内建的万能工厂

    一般用于插件式框架程序和设计模式的实现,当然反射是一种手段可以充分发挥其能量来完成你想做的任何事情(前面好象见过一位高人用反射调用一个官方类库中未说明的函数。。。)

    示例:

    using System;
    using
     System.Collections.Generic;
    using
     System.Text;

    namespace
     Example25Lib
    {
    public class
     Class1
    {
    private string
     name;
    private int
     age;

    //
    如果显式的声明了无参数构造函数,客户端只需要用程序集的CreateInstance即可实例化该类
    //
    在此特意不实现,以便在客户调用端体现构造函数的反射实现
    //
    public Class1()
    //
    {
    //}

    public Class1(string Name, int Age)
    {
    name =
     Name;
    age =
     Age;
    }
    public void ChangeName(string
     NewName)
    {
    name =
     NewName;
    }
    public void ChangeAge(int
     NewAge)
    {
    age =
     NewAge;
    }
    public override string
     ToString()
    {
    return string.Format("Name: {0}, Age: {1}"
    , name, age);
    }
    }
    }

    反射实例化对象并调用其方法,属性和事件的反射调用略去


    using System;
    using
     System.Collections.Generic;
    using
     System.Text;

    //注意添加该反射的命名空间

    using System.Reflection;

    namespace
     Example25
    {
    class
     Program
    {
    static void Main(string
    [] args)
    {
    //加载程序集

    Assembly tmpAss = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory +"Example25Lib.dll");

    //遍历程序集内所有的类型,并实例化

    Type[] tmpTypes = tmpAss.GetTypes();
    foreach (Type tmpType in
     tmpTypes)
    {
    //获取第一个类型的构造函数信息

    ConstructorInfo[] tmpConsInfos = tmpType.GetConstructors();
    foreach (ConstructorInfo tmpConsInfo in
     tmpConsInfos)
    {
    //为构造函数生成调用的参数集合

    ParameterInfo[] tmpParamInfos = tmpConsInfo.GetParameters(); 
    object[] tmpParams = new object
    [tmpParamInfos.Length];
    for (int i = 0; i < tmpParamInfos.Length; i++
    )
    {
    tmpParams[i] =
     tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName);
    if (tmpParamInfos[i].ParameterType.FullName == "System.String"
    )
    {
    tmpParams[i] = "Clark"
    ;
    }
    }

    //实例化对象

    object tmpObj = tmpConsInfo.Invoke(tmpParams);
    Console.WriteLine(tmpObj);

    //获取所有方法并执行

    foreach (MethodInfo tmpMethod in tmpType.GetMethods())
    {
    //为方法的调用创建参数集合

    tmpParamInfos = tmpMethod.GetParameters();
    tmpParams = new object
    [tmpParamInfos.Length];
    for (int i = 0; i < tmpParamInfos.Length; i++
    )
    {
    tmpParams[i] =
     tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName);
    if (tmpParamInfos[i].ParameterType.FullName == "System.String"
    )
    {
    tmpParams[i] = "Clark Zheng"
    ;
    }
    if (tmpParamInfos[i].ParameterType.FullName == "System.Int32"
    )
    {
    tmpParams[i] = 27
    ;
    }
    }
    tmpMethod.Invoke(tmpObj, tmpParams);
    }

    //调用完方法后再次打印对象,比较结果

    Console.WriteLine(tmpObj);
    }
    }

    Console.ReadLine();
    }
    }
    }
  • 相关阅读:
    Winpcap网络开发库入门
    主机字节序与网络字节序的转换
    WORD与DWORD
    TCP/IP各种数据包结构体
    解析IPV4报文 和IPV6 报文的 checksum
    TCP头校验和计算算法详解
    第九次作业:DFA最小化,语法分析初步
    第八次作业:非确定的自动机NFA确定化为DFA
    第七次:正规式、正规文法与自动机
    第六次作业:正规文法与正规式
  • 原文地址:https://www.cnblogs.com/xiaowangtongxue123/p/13130413.html
Copyright © 2011-2022 走看看