.net反射简介

目录 [隐藏]

.net反射简介-概述

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

.net反射简介-一些在反射中经常使用的类

Assembly类

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

Type类

      反射的中心是System.Type类。System.Type类是一个抽象类,代表公用类型系统中的一种类型。这个类使您能够查询类型名、类型中包含的模块和名称空间、以及该类型是一个数值类型还是一个引用类型。
System.Type类使您能够查询几乎所有与类型相关的属性,包括类型访问限定符、类型是否、类型的COM属性等等。

Activator类

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

Binder类

      Binder类是一个用于执行类型转换的绑定器,Type对象的InvokeMember方法接受Binder对象,这个对象描述了如何将传递给InvokeMember的参数转换成方法实际需要的类型。
      Binder类是一个抽象类,要创建绑定器,需要重写方法BindToMethod、BindToField、SelectMehtod、SelectProperty和ChangeType。

DefaultMemberAttribute类

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

.net反射简介-其它

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

.net反射简介-示例


 
类定义:
using System;
using System.Collections.Generic;
using System.Text;

namespace ReflectionSample
{
    /**//**//**
    /// 说明:一个简单的类
    /// 作者:文野
    /// 联系:stwyhm.cnblog.com
    ///
    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;

/**//**//**
/// 说明:一个简单的使用反射示例
/// 作者:文野
/// 联系:stwyhm.cnblog.com
///
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创建一个实例#region 使用Activator创建一个实例

        // 通过对象类型创建对象实例
        ClassSample s1 = Activator.CreateInstance(classSampleType) as ClassSample;

        Response.Write(s1.name + "(使用Activator创建一个实例)");

        #endregion

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

        // 调用无参构造
        ConstructorInfo studentConstructor1 = classSampleType.GetConstructor(new Type[] { });
        ClassSample s2 = studentConstructor1.Invoke(new object[] { }) as ClassSample;
        Response.Write(s2.name + "");

        // 调用有参构造
        ConstructorInfo studentConstructor2 = classSampleType.GetConstructor(new Type[] { typeof(string) });
        ClassSample s3 = studentConstructor2.Invoke(new object[] { "您调用了有参构造创建了一个类实例。" }) as ClassSample;
        Response.Write(s3.name + "");

        #endregion

        反射方法反射方法#region 反射方法

        // 调用非静态方法
        string returnValue1 = classSampleType.InvokeMember("PublicClassMethod", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] { }) as string;
        Response.Write(returnValue1 + "");

        // 调用静态方法
        string returnValue2 = classSampleType.InvokeMember("StaticMethod", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, s1, new object[] { }) as string;
        Response.Write(returnValue2 + "");

        // 调用私有方法
        string returnValue3 = classSampleType.InvokeMember("PrivateClassMethod", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, s1, new object[] { }) as string;
        Response.Write(returnValue3 + "");

        #endregion

        反射参数反射参数#region 反射参数

        MethodInfo parameterMethod = classSampleType.GetMethod("ParameterMethod");
        ParameterInfo[] paras = parameterMethod.GetParameters();
        for (int i = 0; i ", new object[] { paras[i].Name, paras[i].ParameterType.ToString(), paras[i].IsOptional.ToString(), paras[i].Position.ToString(), paras[i].DefaultValue.ToString() }));

        #endregion

        反射属性反射属性#region 反射属性

        classSampleType.InvokeMember("Property", BindingFlags.SetProperty | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] { "您反射了一个属性" });
        string returnValue4 = classSampleType.InvokeMember("Property", BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] { }) as string;
        Response.Write(returnValue4 + "");

        #endregion

        反射字段反射字段#region 反射字段

        classSampleType.InvokeMember("Field", BindingFlags.SetField | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] { "您反射了一个字段" });
        string returnValue5 = classSampleType.InvokeMember("Field", BindingFlags.GetField | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] { }) as string;
        Response.Write(returnValue5 + "");

        #endregion
    }
}

转载于:https://www.cnblogs.com/lhuser/articles/1644664.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/362931.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

带有Angular JS的Java EE 7 –第1部分

今天的帖子将向您展示如何使用Java EE 7和Angular JS构建非常简单的应用程序。 在去那里之前,让我告诉您一个简短的故事: 我不得不承认,我从来都不是Java语言的忠实拥护者,但是我仍然记得我第一次使用它。 我不记得确切的年份&am…

深入理解CSS定位中的堆叠z-index

前面的话 对于所有定位,最后都不免遇到两个元素试图放在同一位置上的情况。显然,其中一个必须盖住另一个。但,如何控制哪个元素放在上层,这就引入了属性z-index 定义 利用z-index,可以改变元素相互覆盖的顺序。这个属性…

初识服务发现及Consul框架的简单使用

初识服务发现及Consul框架的简单使用 1.什么是服务发现? 服务发现组件记录了(大规模)分布式系统中所有服务的信息,人们或者其它服务可以据此找到这些服务。 DNS 就是一个简单的例子。 当然,复杂系统的服务发现组件要提…

进程间的通信方式

5,进程间通信方式____ ,____ ,____ ,____ ,____ ,_____。 管道 消息队列 共享内存 信号 信号量 套接字 管道通信:实质是管道文件操作,分为有名管道和 无名管道两种。 无名管…

JavaFX技巧4:总结

在为JavaFX开发自定义控件时,我强烈建议您遵循JavaFX核心控件的脚步,并使控件的API尽可能最终化,并在所有方法声明的前面放置“ final”关键字。 例 在FlexGanttFX中,我有很多看起来像这样的代码: public final Acti…

CSS光标cursor

前面的话 在浏览器中&#xff0c;光标对于提供交互反馈很有用。通过在不同的场景中改变光标&#xff0c;就能赋予其不同的含义 定义 cursor光标 值: [<uri>,]*[auto | default | pointer | crosshair | move | e-resize | ne-resize | nw-resize | n-resize | se-resize …

jquery获取value值时将数字型字符串前面的0自动截取处理方法

<li class"cwhite" value"02" id"02" οnclick"getQuestionList(02,this);">数学</li> var subjectCode $(obj).find(".bd.subject li[classcwhite active]").val(); 这种方法会把02前面的0自动截取 var subje…

《Effective C#》Item 21:用委托实现回调

委托属于C#中的新名词&#xff0c;它的应用也非常广泛&#xff0c;例如事件就是委托最简单而又直接的例子。 那么首先说说什么是委托&#xff0c;其实委托在用过C或者C的人看来就是函数指针&#xff0c;不过使用C#的大多数人都没有用过这两门语言&#xff0c;因此对委托的理解不…

人生建议

1、不要在最幸福的时候许诺。 2、不要在暴怒的时候回信息。 3、不要在悲伤的时候做决定。 4、不要在迷茫的时候选择轻松的道路。 5、不要在自己做决定后怪别人。 6、不要把现在的幸福当作理所当然。 转载于:https://www.cnblogs.com/tarenacode/p/11460619.html

Spring MVC中的验证组

可以通过groups属性将Bean验证中的验证约束添加到一个或多个组。 这使您可以限制在验证期间应用的约束集。 在某些小组应先于其他小组进行验证&#xff08;例如在向导中&#xff09;的情况下&#xff0c;这可能很方便。 从Spring MVC 3.1开始&#xff0c;可以通过org.springfra…

表单美化

前面的话 由于一些系统原生的表单控件在各个浏览器中显示效果不一致&#xff0c;且无法设置某些关键CSS样式&#xff0c;为了保证表单在各浏览器中的兼容性&#xff0c;表单美化就是不得不做的一件事了 单选按钮 【实现效果】 style"width: 100%; height: 120px;" s…

【Python3.6】python打包成exe

D:\python_test>pip3 install pyinstaller…………D:\python_test>pyinstaller -F -w ui.py 84 INFO: PyInstaller: 3.3.1 85 INFO: Python: 3.6.4 88 INFO: Platform: Windows-10-10.0.15063-SP0 93 INFO: wrote D:\python_test\ui.spec 94 INFO: UPX is not available.…

算法题解:连续子数组的最大和及其下标

题目 输入一个整型数组&#xff0c;数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。 举例 输入&#xff1a;2, -3, 4, 5, -9 输出&#xff1a;9 和最大的连续子数组是 {4, 5}&#xff0c;结果就是9。 思路…

简而言之,JUnit:Hello World

对于Java世界中的开发人员而言&#xff0c; JUnit似乎是最受欢迎的测试工具 。 因此&#xff0c;难怪就此主题已经写了一些好书 。 但是&#xff0c;通过以顾问为生&#xff0c;我仍然经常遇到程序员&#xff0c;他们至多对工具及其正确用法都不了解。 因此&#xff0c;我想到…

jQuery获取所有父级元素及同级元素及子元素的方法

jQuery获取所有父级元素及同级元素及子元素的方法 1.获取父级元素 $("#id").parent() 获取其父级元素 $("#id").parents() 获取其所有的祖先元素 $("#id").closest() 获取其最近的祖先元素&#xff0c;依次上溯 2.获取同级元素 $("#…

考取RHCE认证的历程,总结的经验

昨天去考试的&#xff0c;今天下午结果出来了&#xff0c;达到了我的预期。成功的获取了RHCE认证&#xff0c;以后我也是有证的人咯~&#xff0c;开个玩笑。 其实去年的时候我就曾经想要去考取的&#xff0c;我原来一直以为考取RHCE认证时考题都是英文的呢&#xff1f;因为我英…

Python萌新笔记

Mychael上了大学&#xff0c;对Python产生了浓厚的兴趣&#xff0c;便开始了Python的学习 学习的时候&#xff0c;感觉Python确实比以往学的C表达简洁很多&#xff0c;而又不失强大 以后的学习笔记就记在这啦 变量 Python中的变量无需声明&#xff0c;其类别也只有具体赋值的时…

明天一定要记得放一个硬币在口袋

以前上班总是从陆家嘴站下来&#xff0c;然后走到公司。现在改从东昌路站下。地铁陆家嘴站附近&#xff0c;现在正忙着收尾世博前的那些形象工程。满地的泥土、污水&#xff1b;空气中充斥着机器的轰鸣声、粉尘、烟雾、臭气。更让人难受的还有哪些长着&#xff0c;遭受了地震蹂…

命令设计模式的应用

嗨&#xff0c;您好&#xff01; 今天&#xff0c;我将与您分享一种非常出色的编程设计模式。 它有很多用法&#xff0c;是我的最爱之一。 编程设计模式命令具有多种用例。 在这篇文章中&#xff0c;我们将看到如何实现现实世界中的某些东西。 我们将使用电子汽车钥匙来打开&…

代码块,-- 循环结构--字符串的格式化--字符串相关函数功能

### -代码块 以冒号作为开始,用缩进来划分相同的作用域,称之为代码块,代码块是一个整体,一个文件也可称代码块 作用域&#xff1a;作用的区域 ### -流程控制 (1)流程控制的定义 (2)流程控制的结构 ### -分支结构 关键字:if elif else (1)分支结构的种类 (2)分支结构的特点 ###…