.NET反射实例

.NET反射讲解及实例 该文档详细描述了反射的知识点,并附加有一个实例,对初学者学习反射非常有帮助。 立即下载

转自:http://www.cnblogs.com/wwlearn/articles/2459233.html

在上篇《程序集和反射(一)》中,我们重点讲解了“程序集”和反射的基本概念,原理等。有的读者可能会认为这些枯燥的理论没啥用,其实不然。据我的经历,面试中问到的很多。能够透彻的理解“程序集,反射等”,而且能在日常开发中灵活的运用反射,是一个优秀的.NET开发人员的重要参考标准。呵呵。

本节中,我将通过具体的实例。教大家如何在)C#).NET开发中使用反射。

首先,我新建一个普通的类库项目。在该项目的测试类中,定义好 属性、静态方法、实例方法、无参方法等... 代码如下:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace ReflectorTest

{

    class Test

    {

        private string name;

        public string Name { get; set; }

        /// <summary>

        /// 静态方法

        /// </summary>

        /// <returns></returns>

        public static string staticMethod(string  name)

        {

            return name;

        }

        /// <summary>

        /// 实例方法

        /// </summary>

        /// <param name="name"></param>

        /// <returns></returns>

        public string sayHello(string name) 

        {

            return "hello:" + name;

        }

        /// <summary>

        /// 无参的方法

        /// </summary>

        /// <returns></returns>

        public string noParm() 

        {

            return "I'M  A noParm Method";

        }

    }

}

上面的类库项目,编译通过后,会生成一个DLL文件。好的,我们就是要通过“反射”技术,来尝试着看看这个DLL里面包含的相关元素信息,做一些模拟的操作等。

有点类似于“反编译”吧?呵呵。其实著名的Reflector.NET反编译工具,就是利用反射的原理。还有Microsoft Visual Studio 中的调试,背后也是利用反射技术..

具体的使用代码如下(都有详细的使用说明,注释。读者可以一目了然):

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Reflection;

namespace Demo

{

    class Program

    {

        static void Main(string[] args)

        {

           // reflectorInfo();

            reflectorDemo();

            Console.ReadKey();

        }

        /// <summary>

        /// 利用反射去调用程序集中(包含的类)所包含的方法,属性,成员...

        /// </summary>

        public static void reflectorDemo() 

        {

            Assembly ass;

            Type type;

            MethodInfo method;

            try

            {

ass = Assembly.LoadFile(@"F:\Projects\ReflectorTest\ReflectorTest\bin\Debug\ReflectorTest.DLL");//根据物理DLL路径尝试加载

                type = ass.GetType("ReflectorTest.Test");//根据类型名称,反射出该类型(注意格式是:“命名空间.类名”)

                object o =Activator.CreateInstance(type);//创建该类型的对象实例

                method=type.GetMethod("sayHello");//反射获取方法(实例方法)

               string s = (string)method.Invoke(o,new string[] {"dinglang"});//调用实例方法

               Console.WriteLine("调用实例方法返回:"+s);

                method=type.GetMethod("noParm");//无参方法

                s= (string) method.Invoke(o,null);//调用无参函数

                Console.WriteLine("调用无参方法返回:"+s);

                //type.GetProperties()//获取该类型下面的所有公共属性

                

                method=type.GetMethod("staticMethod");//静态函数

                s=(string)method.Invoke(null,new string[]{"dinglang"});//调用静态方法

                Console.WriteLine("调用静态方法返回:"+s);

                //根据指定的属性名称,获得属性值

                type.GetProperty("Name").GetValue(o,null);

                //给属性设值

                type.GetProperty("Name").SetValue(o, "dinglang", null);

            }

            catch (Exception)

            {

                throw;

            }

            finally

            {

                  ass=null;

                type=null;

                method=null;

               

            }

           

        }

        /// <summary>

        /// 利用反射获取程序集中类,类的成员(方法,属性等)

        /// </summary>

        public static void reflectorInfo() 

        {

            Assembly ass = Assembly.LoadFrom(@"F:\Projects\ReflectorTest\ReflectorTest\bin\Debug\ReflectorTest.DLL");//加载程序集

            Module[] modules = ass.GetModules();//模块信息  

            Type[] types = ass.GetTypes();//获取该程序集所包含的所有类型

            foreach (var item in types)

            {

                Console.WriteLine("所包含的类型类型名称:" + item.Name);

                MethodInfo[] methods = item.GetMethods();//获取该类型下所包含的方法信息

                foreach (var method in methods) 

                {

                    Console.WriteLine("该类下所包含的方法名称:"+method.Name);

                }

                PropertyInfo[] PropertyInfo = item.GetProperties();

                foreach (var pro in PropertyInfo)

                {

                    Console.WriteLine("该类下所包含的属性名称:" + pro.Name);

                }

            }

        }

    }

}

读者可以参照以上代码,自己实际动手敲代码试试。还不夸张的说,当你真正学会了“反射”后,你会爱上“反射”。但是值得提醒的是:反射可能会很耗性能哦。希望大家在适当的场合下合理使用。

摘自 编程世界一凡人

 

利用反射动态创建对象在VS.Net中,有很多种方法动态调用对象的构造函数 在VS.Net中,有很多种方法动态调用对象的构造函数。一是通过Activator类的CreateInstance()方法。这个方法我们在Remoting中也用过。它实际上是在本地或从远程创建对象类型,或获取对现有远程对象的引用。它的方法签名是:public static object CreateInstance(Type);(还有其他重载方法)注意它的返回值为object,MSDN对返回值的描述是:对新创建对象的引用 立即下载

相关推荐

树莓派4B没有serial0或ttyS0,serial0没有映射到ttyS0,serial0和serial1调换映射

环境: 树莓派4B,ubuntu mate20 现象 终端输入ls -l /dev,发现只有serial1->ttyAMA0,没有serial0页没有ttyS0,更没有二者的映射。网上很多方法都是树莓派3B和3B+的,我自己试过,不太适用于4B,下面的方法是4B的,我自己用是成功的。 解决方法 cd /boot/firmware sudo gedit config.txt 注意不是/boot下的config,而是/boot/firmware下的config 打开文件后,找到enable_uart=0

qq_41208487的博客 7891

.Net 反射用法

.Net 进阶 1、反射加载实体类、实例方法 2、反射实现工厂可配置类 3、反射调用泛型类、泛型方法 4、反射使用类字段和类属性

小鹰的博客 1300

保姆级教程:用Java和HslCommunication库搞定三菱PLC数据读写(附完整代码)

本文提供了一份详细的Java与三菱PLC通信教程,通过HslCommunication库实现高效数据读写。内容涵盖环境配置、通信模式选择、数据类型操作、异常处理及性能优化,并附有完整代码示例,帮助开发者快速掌握工业自动化中的PLC数据交互技术。

weixin_28731223的博客 228

.NET利用反射动态获取程序集的实例对象

在日常的.net程序开发过程中,我们经常会定义一些实体类,用于给业务操作时提供方便,那么就会出现对实体进行赋值。通常的做法我们会把他们一一列举出来进行复制,如果实例类的属性比较多,通过上面的做法就会比较繁琐。下面我们利用反射来进行获取对象并进行复制。下面讲述在现项目中反射另外一个项目编译成的dll中的内容 /// <summary> /// BDU.dll保存路径...

weixin_34268579的博客 359

CH341的I2C流模式(StreamI2C)到底怎么用?从EEPROM读写到自定义设备,一篇讲清参数配置逻辑

本文详细解析了CH341的I2C流模式(StreamI2C)的使用方法,从EEPROM读写到自定义设备的参数配置逻辑。通过深入分析I2C协议基础、StreamI2C参数映射关系及典型设备配置示例,帮助开发者快速掌握StreamI2C的应用技巧,解决实际开发中的常见问题。

weixin_30932215的博客 449

XGBoost特征重要性为0的问题:深度解析与应对策略

在机器学习领域,XGBoost(Extreme Gradient Boosting)作为一款高效且强大的集成学习算法,已经被广泛应用于各类预测任务中。然而,在实际应用过程中,许多数据科学家和工程师们遇到了一个令人困惑的现象——某些特征的重要性值为0。这不仅影响了模型的解释性,还可能导致特征选择过程中的误判。本文将深入探讨这一问题,分析其背后的原因,并提供相应的解决方案。在深入探讨特征重要性为0的问题之前,我们首先需要了解XGBoost是如何计算特征重要性的。XGBoost提供了三种常见的特征重要性计算方法:

cda2024的博客 1705

.net反射实例

using System;using System.Collections.Generic;using System.Text;using System.Reflection; namespace ConsoleApplication1{ class Program { static void Main(string[] args) { ...

weixin_34273479的博客 145

一步步带你用C#开发Modbus通信上位机(附完整代码与工程思路)

Modbus上位机开发指南(C#实现) 本文详细介绍使用C#开发Modbus上位机系统的全过程,覆盖RTU和TCP两种协议。内容包含:1)需求分析与技术选型(WinForms+NModbus4);2)分层架构设计(UI/业务/通信层);3)通信层核心代码实现(串口/以太网连接、数据读写);4)功能模块开发(设备管理、数据采集、远程控制)。提供可直接复用的Modbus RTU客户端代码示例,包含连接管理、线圈读写、寄存器操作等工业场景必备功能。通过系统化的开发流程,帮助开发者快速构建稳定可靠的Modbus监控

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 821

.Net反射 实例化对象 执行函数

   Type type = typeof(CatchTaobao);    var  typeObj = Activator.CreateInstance(type, null) as CatchTaobao;//获取类    PropertyInfo prop = type.GetProperty("fileSavePath");//参数赋值    if (prop != null)    ...

俞祥胜的.Net进阶之旅 727

Claude Code(8):使用 skill-creator 打造属于测试人员的 Skills

本文介绍了如何使用Claude Code的skill-creator工具快速创建测试相关的Skills。skill-creator是一个专门用于创建新Skills的Skill,相比手动创建更高效。文章详细演示了安装skill-creator的步骤,并通过创建"测试计划编写助手"的实战案例,展示了如何通过对话方式定义Skill名称、触发条件和功能需求。skill-creator会自动生成完整的SKILL.md文件和目录结构,用户只需确认即可完成Skill创建。

blues_C的博客 526

基于MUSIC算法的DOA估计Matlab仿真

特别需要指出的是:通道与阵元并不是一一对应,通道是由空间的一个、几个或所有阵元合成的,当然空间某个特定的阵元可包含在不同的通道内。空间谱估计侧重于研究空间多传感器阵列所构成的处理系统对感兴趣的空间信号的多种参数进行准确估计的能力,其主要目的是估计信号的空域参数或信源位置,这也是雷达、通信、声纳等许多领域的重要任务之一。从系统框图中可以清晰的看出,估计空间相当于是对目标空间的一个重构过程,这个重构的精度由众多因素决定,如环境的复杂性、空间阵元的互耦、通道不一致、频带不一致等。

FPGA/MATLAB学习教程/源码/项目合作开发 1747

.NET基础:利用反射原理实现动态创建对象

.NET中利用反射原理实现动态创建对象1.静态创建创建对象一般是创建类库,其中包含各种类,类中有各种方法,在所需的程序及调用时一般采用 类库名.类名 命名= new类库名.类名(); 命名.方法名(); 的方式调用 例如:Weapon.Staff stf = new Weapon.Staff();//静态创建对象 stf.Hit();但在已完成的程序中添加新项时对代码改动需...

superlee 1620

一文让你轻松理解Wi-Fi理论速率计算方式

如上所示,在使用FDM的802.11协议上,最小子载波带宽为312.5KHz,那一个信道频宽为20MHz的信道可以分成64个子载波,但是由于技术原因,有效使用的是52个子载波,实际用于数据传输的只有48个,有4个子载波充当导频载波。载波:交流信号或者直流信号本身不具备数据传输能力,但是如果信号发生很小的波动或者变化,从而实现数据的收发。所谓子载波,就是将信号划为为很多的小信道,这些小信道可以实现数据的并发传输,子载波我们英文称为subcarrier,也称为音调(tone)。Symbol time如下所示。

1042484520@qq.com(邮箱) 3448

.net反射机制实例

.net反射机制为创建对象和调用其他方法提供了替代方案。比如为了提高代码的灵活性。但是问题确是我们要编写更多的代码来实现。 使用反射机制是有一些缺点的。其最大的缺点就是编译器无法对对象进行类型检查,此时IDE的智能感知将无能为力。但是他的真正优势又在什么地方呢?它提供了一种手段

瞧字不识 1192

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

net反射机实例说明

.net反射机制为创建对象和调用其他方法提供了替代方案。比如为了提高代码的灵活性。但是问题确是我们要编写更多的代码来实现。使用反射机制是有一些缺点的。其最大的缺点就是编译器无法对对象进行类型检查,此时IDE的智能感知将无能为力。但是他的真正优势又在什么地方呢?它提供了一种手段,将指定具体类推迟到了运行时刻。使用反射机制调用方法的四步曲:1 加载程序集2 获取类的类型3 创建该类

老汉--小庙和尚 2231

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

如何通过C#.NET中的反射机制来创建C#.NET泛型类的实例,并调用其方法??

如何通过C#.NET中的反射机制来创建C#.NET泛型类的实例,并调用其方法?

走错路的程序员 4548

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

vb.net反射中如何将字符串转化为对象实例

Imports System.Reflection Public Class Form1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim o As Object = Activator....

weixin_30908649的博客 294

.net core精彩实例分享 -- 反射与Composition

文章目录介绍具体案例用Activator类创建类型实例检查类型上所应用的自定义Attribute通过协定来约束导出类型导入多个类型封装元数据总结 介绍 随着.net core越来越流行,对.net core 基础知识的了解,实际应用等相关的知识也应该有所了解。所以就有了这篇文章,案例都是来自阅读的书籍,或者实际工作中感觉比较有用的应用。分享亦总结。 本文主要介绍 .net core 相关的反射与Composition案例。 具体案例 用Activator类创建类型实例 【导语】 除了通过 Construct

寒冰屋的专栏 878

.Net 中的反射(动态创建类型实例)

来自:张子阳http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx 动态创建对象 在前面节中,我们先了解了反射,然后利用反射查看了类型信息,并学习了如何创建自定义特性,并利用反射来遍历它。可以说,前面三节,我们学习的都是反射是什么,在接下来的章节中,我们将学习反射可以做什么。在进行更有趣的话题之前,我们先看下如何动态地创

码农 805

.Net中的反射(动态创建类型实例) - Part.4

.Net 中的反射(动态创建类型实例) - Part.4 动态创建对象 在前面节中,我们先了解了反射,然后利用反射查看了类型信息,并学习了如何创建自定义特性,并利用反射来遍历它。可以说,前面三节,我们学习的都是反射是什么,在接下来的章节中,我们将学习反射可以做什么。在进行更有趣的话题之前,我们先看下如何动态地创建一个对象。 我们新建一个Console控制台项目,叫做Reflection4...

weixin_30532973的博客 133
上一篇: NHibernate 非自增主键与自增主键的映射文件配置
下一篇: 数据库磁盘文件满了,你该怎么办?
ArvinStudy
博客等级 码龄15年 83粉丝 193原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值