C#反射

使用C#的反射机制时遇到的问题 今天是郁闷了一整天呐,这个项目参考PetShop 4.0的多层架构设计,当然,还是没有分得那么详细,数据访问也只为SQLserver做了考虑,因为这个项目与网关有联系,不可能迁移到oracle,所以也就没为oralce做接口。项目DALFactory是采用工厂模式设计的,设计模式的书我也曾看过java的设计模式,理解也不太深刻,但对工厂模式还是较为熟悉,使用它可以根据需求返回不同的实例对象,在 阅读详情

C#反射

今天没事研究了一下c#反射的内容 , 给你们分享一下 反射入门
概念: 反射 就是程序运行时 可以动态获取类的相关信息 比如 类的字段 方法 方面名称 命名空间等 。
反射用到的命名空间:
这里写图片描述
我测试 不引入命名空间 System. Type 也可以进行反射演示 好了 废话不多说了 我们直接程序

Demo

打开vs2012 建立一个控制台程序TestReflection
在这个控制台程序添加一个类库 类库的名字是Model
这里写图片描述
好了 这个类是我们来做测试的 请先记住命名空间 属性名称 以及方法名

好了 现在我们一起看一下 主函数中的代码

namespace TestReflection
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly ass =Assembly.LoadFrom("Student.dll");
            Type[]   type=ass.GetTypes();
        }
    }
}

我们来看一下 主函数中 的 Assembly ass =Assembly.LoadFrom(“Student.dll”);代码是什么意思;
看到这行代码 是神马玩意??? 没有见过啊
传的参数Student.dll这又是什么 ,不知道没有关系 我们一起来看一下 c#编译之后是什么 ,首先我们找到项目的路径在文件中打开Student这个类里面的obj/Debug/
这里写图片描述

看到了吗 这个dll文件就是 Student编译之后的dll文件 (这点 和java不一样 java是编译之后是个class文件 然后之后可以生成jar文件 来共开发者使用)
好了不说废话了 继续 go on
Assembly 这个类就是就是封装了这个编译之后的类的相关属性
Assembly 中文意思是装配 哈哈 英语好的 是不是 很有帮助啊
注意:Student.dll这个文件要把他复制到你的主函数文件夹的bin目录下 不然会报错 这里写图片描述
这个类中有个GetTypes()这个方法 这个方法把类的属性 方法 等有封装在这个属性中 相当于做了一次类型转换 。
好了 我们现在利用Type这个类获取我们自定义类的一些属性 和方法
首先 我们先获取 类的 命名空间
string name = type[0].Namespace; 把这句加到主函数中
结果:
这里写图片描述
下面我们来看一下 获取类的名称
string name = type[0].Name;
结果:
这里写图片描述
下面我们来看一下 获取类中所有属性

PropertyInfo[] info = null;
foreach (Type t in type)
{
info= t.GetProperties();
}
foreach (PropertyInfo s in info)
{
Console.WriteLine(s);
}

GetProperties(); 这个方法是返回类的所有属性 返回值类型是PropertyInfo[]
这里写图片描述
PropertyInfo[]这类数组是封装了 反射得到的类的属性 集合
得到所有的方法 和这个类似 我们直接把代码贴出来你们参考下
MethodInfo[] info = null;
foreach (Type t in type)
{
info = t.GetMethods();
}
foreach (MethodInfo s in info)
{
Console.WriteLine(s);
}

看下结果:
这里写图片描述
这里列出的方法 除了类中的方法 还有几个是继承object这个类的方法
说了这么多 还没有到重点呢 , 神马玩意 说了这么多还没有到重点 , 现在 我们一起来看一下 利用反射实例化对象 一般我们实例化对象就是利用new关键字 现在我们不用这个 来进行实例化 下面看代码
我们在开始实例化之前我们在来认识一个类 Activator 这个类
这个类是获取远程对象的引用 我个人认为 这个就是把反射得到的类对象进行激活)
Activator这个类里面有个方法CreateInstance(); 这个方法就是创建对象用的 我们一起来看代码

Type classname = null;
foreach (Type t in type)
{
if (t.Name == "Student")
{
classname = t;
}
}
object obj = Activator.CreateInstance(classname);

这里写图片描述
看下 成功调用了 类中无参构造方法 这个就是利用反射进行实例化的对象

我们来看下类中没有无参构造函数 会是什么样子的 直接给你们结果
这里写图片描述
居然没有报错?? 但是我们不能创建对象了??这是为什么呢、?? 原来反射得到类的对象 类中必须要有无参构造 (这一点和java一样 但是java没有无参构造 会报错 c#居然不会报错 我还以为C#也会报错呢 看来是我多想了 哈哈)

  Type classname = null;
            foreach (Type t in type)
            {
                if (t.Name == "Student")
                {
                    classname = t;
                }


            }
            object obj = Activator.CreateInstance(classname);

            Console.WriteLine(type);
            MethodInfo[] info = null;
            foreach (Type t in type)
            {
                info = t.GetMethods();
            }
            foreach (MethodInfo s in info)
            {
                Console.WriteLine(s);

            }
            //调用Query方法
        MethodInfo   method= classname.GetMethod("Query");
//执行方法
method.Invoke(obj, null);




这里写图片描述

看倒数第二行 是不是成功调用方法了 ~~~~~~~
好了 反射 我们就先讲到这里 关于反射 我会在以后在更新

C# 高级--反射 详解 C#来自于System.Reflection,是一个帮助类库,可以读取dll/exe中metadata,使用metadata创建对象。获取方法MethodInfo,执行MethodInfo 的Invoke方法,传递方法所在的类的实例对象+参数。需要传递一个object类型的数组作为参数,参数按照从昨往右严格匹配,如果没有匹配的报异常。中间语言,编译把高级语言编译后得到的C#中最真实的语言状态,面向对象语言。需要通过方法参数类型类区别方法,传递参数,严格匹配参数类型。一种反射技术,可以动态创建dll/exe。 阅读详情

相关推荐

C#的反射

一、反射介绍 反射:指程序可以访问、检测和修改它本身状态或行为的一种能力(即:审查元数据并收集关于它的类型信息的能力) ①元数据(编译以后的最基本数据单元)可以理解为一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。 ②反射则提供了封装程序集、模块和类型的对象(程序集包含模块,而模块包含类型,类型又包含成员【成员--->类型--->模块--->程序集】)。 ③可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象..

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 1万+

C#通过反射方法实现依赖注入

通过反射找到接口的唯一实现类,并创建它,实现动态注入的功能,且还是按需注入。没有引用任何第三方组件,都是轻量级的,入门容易。

1301

基于STM32F407的摄像头(不带FIFO的OV7670)图像采集及LCD显示实验-笔记整理

硬件说明 STM32F4开发板 stm32f4系列的芯片处理的能力可以说非常强大了的,而且内部还自带有数字摄像头接口(DCMI),可以说stm32f407的核心板和不带FIFO的摄像头模块OV7670简直就是绝配! 我手上的这块张这个样子 (图片来源:某宝): F4系列的DCMI接口内部结构框图如下图3所示,具体的配置使用方式可以参考以下这篇博文:《stm32f4的数字摄像头接口(DCMI)使用》 这位博主大大已经很详细地介绍了DCMI接口的具体使用方法和原理,更重要的是里面还有接口的配置函数,虽然不完

LiangWF22的博客 2万+

C#基础8-反射和依赖注入

反射可以在加载程序运行时,动态获取和加载程序集,并且可以获取到程序集的信息反射是在运行期动态获取类、对象、方法、对象数据等的一种重要手段主要使用的类库:System.Reflection核心类:通过以上核心类可在运行时动态获取程序集中的类,并执行类构造产生类对象,动态获取对象的字段或属性值,更可以动态执行类方法和实例方法等。下面是 B 站 c sharp 刘铁锰老师 第一期 依赖注入、反射相关章节中,一个模拟小动物发出叫声的玩具程序的例子。开发商公布 SDK ( dll ) 、一个存放 MOD 文件( dl

cocodeveloper 914

ss524v100 调试cvbs输出

启用视频层3 dev2 对应 layer3在vdec与vo绑定的时候(不需要经过vpss),不能绑定错误,以下是绑定的程序。

2117

Cesium实战:5分钟搞定离线地图与地形加载(附避坑指南)

本文详细介绍了Cesium在内网环境下的离线部署实战方案,重点解决了影像与地形数据的本地加载问题。通过逐步指导项目配置、本地瓦片与自定义地形数据的处理,并优化相机控制体验,帮助开发者快速构建安全、高效的三维地球应用,避免常见的401错误与加载失败陷阱。

weixin_30632089的博客 283

C# 使用反射添加业务功能、反射赋值简单示例

using System; using System.Reflection; namespace TestNameSpace { class ProcTime { static void Main(string[] args) { Assembly assembly = Assembly.GetExecutingAssembly(); Test test = (Test)assembly.CreateIns

一个编程的同学 570

从Gitee上部署视觉工程到Linux虚拟机

(使用SVM来识别装甲板的编号,此处手机上的图片中只有灯条没有数字,SVM无法识别出编号。这两行代码的意义是,当SVM识别不出或者识别不到编号时,把装甲板的编号默认为2号。找到自瞄程序中,数字识别类下的这两行代码,把注释去掉。这样,每次打开新的终端时,环境变量都会自动设置。(2)查看虚拟机设置选项,检查虚拟机USB接口是否为3.0及以上的接口。如果不是,要更改好。这样,每次打开新的终端时,环境变量都会自动设置。后,每次打开终端时自动设置这些环境变量,你可以将。打开第一个终端,用来挂ROS的内核启动页面。

2301_81035291的博客 1520

C#反射方法扩展

反射是程序猿的好帮手,有了反射你可以少写一半的代码。下面是一些常用的反射扩展方法。 源代码: using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; ...

weixin_34128839的博客 564

液滴/液膜蒸发过程—in文件模拟-后处理分析-Ovito/Python绘图

液滴/液膜蒸发过程—in文件模拟-后处理分析-Ovito/Python绘图

Rockyoung 3326

zemax---光学设计基础概念篇(持续更新中)

光学设计相关知识概念

u011699626的博客 1147

c#之反射详解

C#之反射详解

鲤籽鲲的博客 2万+

YOLOv8改进有效系列目录 | 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制

Hello,各位读者们好,本专栏自开设两个月以来已经更新改进教程120+余篇其中包含C2f、主干、检测头、注意力机制、Neck多种结构上创新,也有损失函数和一些细节点上的创新,订阅本专栏以后你不仅可以收获跟专栏的阅读权限,同时可以进Qq群,里面包含集成我所有创新的YOLO最新目录,和我本人录制的视频讲解教程,如果你想要在YOLOv8系列收获一篇论文,我相信订阅本专栏后你一定会有所收获~YOLOv8改进有效系列目录。

Snu77的博客 18万+

C#中的反射

一:什么是反射 通俗来讲,反射就是我们在只知道一个对象的外部而不了解内部结构的情况下,通过反射可以使我们明确这个对象的内部实现 反射是.Net中获取运行时类型信息的一种方式,.Net应用程序由几个部分组成:程序集(Assembly)、模块(Module)、类型(Class)。而反射提供一种编程的方式,可以在程序运行期获得这几个组成部分的相关信息 二:反射的作用 利用反射可以在不需要使用new关键词的情况下,就可以动态创建对象,使用对象 三:反射是如何实现的 反射的内部实现依赖于元数据 元数据简单来

L的博客 1万+

ConvNeXt 系列改进:二次创新 ConvNeXt:结合 RepVGG 结构重参数化,训练多分支、推理单路

2026年的视觉模型赛道呈现出一种有趣的“返璞归真”趋势——在Transformer狂飙数年之后,卷积网络正以全新的姿态回归。这其中,ConvNeXt无疑是纯卷积阵营中最耀眼的明星。从2022年Meta AI首次提出至今,ConvNeXt系列已经走过了近四年的演进之路,衍生出ConvNeXt V2、E-ConvNeXt等多个增强版本。ConvNeXt的7×7深度卷积带来了不错的感受野,却也埋下了推理效率的隐患。

ZXSXJ的博客 234

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C#反射详解

目录 反射定义反射(C# 编程指南) 使用场景 形象说明 反射的用途 反射用到的主要类 System.Type类用法 实例应用 System.Reflection.Assembly类的用法 反射定义反射(C# 编程指南)   反射提供了封装程序集、模块和类型的对象(Type类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了特性,可以利用反射对它们进行访问。 使用场景 需要访问程序元数据的特性。 检查..

潘达小新 5776

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

【C#进阶】C# 反射

关于编程语言 C# 反射的介绍。

好学若饥,谦卑若愚。 3112

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C#之反射

动态创建类型实例调用类型的方法访问类型的字段和属性检查类型的元数据(如基类、接口、特性等)运行时类型检查和操作能力动态代码执行的基础框架和库开发的关键技术它可能破坏封装性性能开销较大代码可读性可能降低最佳实践在需要高度灵活性的场景使用(如插件系统、序列化)缓存反射结果以提高性能考虑使用动态类型或源代码生成作为替代方案始终处理可能的反射异常通过合理使用反射,你可以构建出更加灵活和可扩展的C#应用程序。

Major_S的博客 1529

详谈C#反射及应用

反射 什么是元数据?什么是反射? 程序数用来处理数据的,文本和特性都是数据,而程序本身(类的定义和BLC中的类)这些也是数据。 有关程序及其类型的数据被称为元数据,他们保存在程序集中。 程序在运行时,可以查看其他程序集或其本身元数据。一个运行的程序查看本身的元数据或其他程序集的元数据的行为称为反射。 Type 使用 Type 类进行反射,使用特性给类型添加元数据 对于程序中用到的每个类型,CLR 都会创建一个包含这个类型信息的 Type 对象。 程序中每用到一个类型都会关联到独立的 Type 类的对象

菜鸟厚非 2万+

C# 反射

反射(Reflection)是C#语言中一种非常有用的机制,它可以在运行时动态获取对象的类型信息并且进行相应的操作。反射是一种在.NET Framework中广泛使用的技术,它是实现上述特性的基础,非常重要。通过本文的学习,我们了解了反射的基本概念和使用方法,并且掌握了反射的高级用法。反射在C#中是一项非常强大且必要的技术,如果恰当地使用它,可以使我们的编程工作变得更加高效和便捷。同时,我们也需要格外注意反射使用过程中的性能和安全问题,做好样本授权等工作,以便更好地使用反射这个强大的功能。

yu57955的博客 659

C#反射实例

C#反射的入门学习首先要明白C#反射提供了封装程序集、模块和类型的对象等等。那么这样可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性...

zls365365的博客 1038
上一篇: MyBatis 入门教程
下一篇: 文章标题
_徐林
博客等级 码龄9年 6粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值