• 反射


    概述

    反射就是动态发现类型信息的能力。它帮助程序设计人员在程序运行时利用一些信息去动态地使用类型,这些信息在设计时是未知的,这种能力类型于后期绑定。反射还支持的更高级的行为,能在运行时动态创建新类型,并且对这些新类型的操作进行调用。

    一些在反射中经常使用的类

    Assembly

    Assembly类是可重用、无版本冲突并且可自我描述的公共语言运行库应用程序构造块。可以使用Assembly.LoadAssembly.LoadFrom方法动态地加载程序集。

    Type

    反射的中心是System.Type类。System.Type类是一个抽象类,代表公用类型系统中的一种类型。这个类使您能够查询类型名、类型中包含的模块和名称空间、以及该类型是一个数值类型还是一个引用类型。

    System.Type类使您能够查询几乎所有与类型相关的属性,包括类型访问限定符、类型是否、类型的COM属性等等。

    Activator

    Activator类支持动态创建.NET程序集和COM对象。可以通过CreateComInstanceFromCreateInstanceCreateInstanceFromGetObject四个静态方法加载COM对象或者程序集,并能创建指定类型的实例。

    Binder

    Binder类是一个用于执行类型转换的绑定器,Type对象的InvokeMember方法接受Binder对象,这个对象描述了如何将传递给InvokeMember的参数转换成方法实际需要的类型。

    Binder类是一个抽象类,要创建绑定器,需要重写方法BindToMethodBindToFieldSelectMehtodSelectPropertyChangeType

    DefaultMemberAttribute

        DefaultMemberAttribute类用于类型并带有一个指明默认成员名称的字符串参数。能够通过InvokeMember调用默认成员,而不需要传递调用成员的名称。当需要绑定器但不需要特别的绑定行为时就可以使用它。

    其它

    还有一些对元素类型信息描述的类,ConstrutorInfo(构造函数)、MethodInfo(方法)、FieldInfo(字段)、PropertyInfo(属性)、EventInfo(事件)、MemberInfo(成员)、ParameterInfo(参数)。如果查询得到了具有任何类型信息的实例,就可以获得该类型中任意元素的类型信息,当然出于安全原因,不保证会得到程序集中的任何信息。

    示例

    类定义:

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

    namespace ReflectionSample
    {
        
    /**//// <summary>
        
    /// 说明:一个简单的类
        
    /// 作者:文野
        
    /// 联系:stwyhm.cnblog.com
        
    /// </summary>

        public class ClassSample
        
    {
            
    // 默认构造
            public ClassSample()
            
    {
                
    this.name = "您调用了默认构造创建了一个类实例。";
            }


            
    // 带参构造
            public ClassSample(string name)
            
    {
                
    this.name = name;
            }


            
    // 字段 
            public string name;

            
    public string Field;

            
    // 属性
            private string property;
            
    public string Property
            
    {
                
    set this.property = value; }
                
    get return property; }
            }


            
    // public方法 
            public string PublicClassMethod()
            
    {
                
    return string.Format("您反射了一个Public方法");
            }


            
    // private方法
            private string PrivateClassMethod()
            
    {
                
    return string.Format("您反射了一个Private方法");
            }


            
    // static方法
            public static string StaticMethod()
            
    {
                
    return "您反射了一个Static方法";
            }


            
    // 帶參方法
            public string ParameterMethod(string para)
            
    {
                
    return para;
            }


            
    public event EventHandler eventHandler;

            
    public void DoEvent()
            
    {
                eventHandler(
    null,EventArgs.Empty);
            }

        }

    }

    反射示例
    using System;
    using System.Data;
    using System.Configuration;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;

    using System.Reflection;
    using ReflectionSample;

    /**//// <summary>
    /// 说明:一个简单的使用反射示例
    /// 作者:文野
    /// 联系:stwyhm.cnblog.com
    /// </summary>

    public partial class _Default : System.Web.UI.Page
    {
        
    protected void Page_Load(object sender, EventArgs e)
        
    {
            
    string path = Server.MapPath(Request.Path);
            
    string filePath = path.Substring(0, path.LastIndexOf('\\')) + @"\bin\ReflectionSample.dll";
            
    // 获取程序集
            Assembly classSampleAssembly = Assembly.LoadFrom(filePath);

            
    // 从程序集中获取指定对象类型
            Type classSampleType = classSampleAssembly.GetType("ReflectionSample.ClassSample");

            使用Activator创建一个实例
    使用Activator创建一个实例

            动态调用构造函数
    动态调用构造函数

            反射方法
    反射方法

            反射参数
    反射参数

            反射属性
    反射属性

            反射字段
    反射字段
        }

    }
  • 相关阅读:
    总结:关于作用域的经典面试题
    解决JS拖拽出现的问题
    JS正则(3)总结
    JS正则(2)对正则的理解
    JS 闭包 正则(1)
    JS Date对象
    笔记
    9.13笔记
    9.12学习笔记
    9.11学习笔记
  • 原文地址:https://www.cnblogs.com/tommyli/p/540355.html
Copyright © 2020-2023  润新知