C#反射从入门到放弃(这部分遇到的新东西太多了让人接受不能)
首先,我们需要知道type,type是类型的类型(笑
官方点的说法是,BCL声明了一个Type抽象类,它被设计用来包含类型的特性,
使用这个类的对象(抽象类的对象?这显然是错误的,但是这里用的其实是Type的派生类的对象)能让我们获得程序使用的类型的信息,
对于程序用到的每一个类型,CLR都会创建一个包含这个类信息的Type类(其实是Type类的派生类)的对象。
就是你用到的每一个类,都有一个记录类信息的元数据(metadata),是Type类(Type抽象类的一个具体类RuntimeType类)的实例,typeof(你想洞察的类)就是得到 你想洞察的类的元数据。
得到type有两种方式
方式1:

方式2:无需实例对象a直接写
var type1 = typeof(A);
两种方式的得到的type1和type2这两个引用是一样的,因为都是对A这个类获得其type

我们能通过type1得到什么呢?

(这只是显示的一部分,还有很多东西没有显示出来)
返回成员:
GetMember():GetMember是单数,单数就是你要指定一个名字,才能返回
GetMembers():GetMembers是复数,用于取得该类的所有成员的信息
返回方法:
GetMethod():GetMethod是单数,单数就是你要指定一个名字,才能返回
GetMethods():GetMethods是复数,用于取得该类的所有方法的信息
下面的同理...
返回内嵌类型:
返回属性:
等等...
你拿到这些东西(属性,方法)后还可以调用它!
调用属性举例:

注意这里var的类型是PropertyInfo,里面一定包含了大量的东西!

10.png)
我们可以直接用Property.的方式,调用get方法和set方法了。

SetValue([我希望对a操作,a是A类的实例],[赋值的string是aaa],[忽略第三个参数给null即可] );
以上关键代码翻译:
var type1 = typeof(A);
//创建一个Type类的type1“引用”到A类的元数据(也就是type实例,创建A类时就存在了),
var Property = type1.GetProperty("MyProperty");
//通过type1“引用”到A类的元数据(type对象)并且拿到A类中一个叫MyProperty的属性,用Property 来“引用”MyProperty的属性
var a = new A();
//创建一个A类型的实例a
Property.SetValue(a, "aaa", null);
//通过Property“引用到”MyProperty属性,并给a这个实例的MyProperty属性,赋值"aaa"。
这其实相当于绕了一个圈完成了
var a = new A();
a.MyProperty = "aaa";
而且通过反射还可以重写a.MyProperty的值。(原a.MyProperty = "bbb",通过反射改为"aaa")

调用方法举例:
与属性的类似

这里出现了Invoke方法,这个方法类似与属性部分的SetValue();是给方法Function()赋值用的。
Invoke(object obj, object[] paramenters) ;
第一个位置是obj也就是我们要传入的A类型实例a,
第二个位置很奇怪,是个object[],怎么传输呢?
这样写:
function.Invoke(a, new object[] {1});
new一个object加[]然后在{}里写入对应类型的值即可。
C#反射从入门到放弃(这部分遇到的新东西太多了让人接受不能)的更多相关文章
- Struts2入门到放弃
写在前面------------------------------------------------------------------------- 本文章主要从三个方面来学习Struts2框架 ...
- dotnet 从入门到放弃的 500 篇文章合集
本文是记录我从入门到放弃写的博客 博客包括 C#.WPF.UWP.dotnet core .git 和 VisualStudio 和一些算法,所有博客使用 docx 保存 下载:dotnet 从入门到 ...
- Go从入门到放弃
Go语言介绍 为什么你应该学习Go语言? 开发环境准备 从零开始搭建Go语言开发环境 VS Code配置Go语言开发环境 Go语言基础 Go语言基础之变量和常量 Go语言基础之基本数据类型 Go语言基 ...
- 2018-8-10-dotnet-从入门到放弃的-500-篇文章合集
title author date CreateTime categories dotnet 从入门到放弃的 500 篇文章合集 lindexi 2018-08-10 19:16:52 +0800 2 ...
- CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维
前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...
- [精品书单] C#/.NET 学习之路——从入门到放弃
C#/.NET 学习之路--从入门到放弃 此系列只包含 C#/CLR 学习,不包含应用框架(ASP.NET , WPF , WCF 等)及架构设计学习书籍和资料. C# 入门 <C# 本质论&g ...
- OpenStack从入门到放弃
OpenStack从入门到放弃 目录: 为何选择云计算/云计算之前遇到的问题 什么是云计算 云服务模式 云应用形式 传统应用与云感知应用 openstack及其相关组件介绍 flat/vlan/gre ...
- 绕过校园网的共享限制 win10搭建VPN服务器实现--从入门到放弃
一.开篇立论= =.. 上次说到博主在电脑上搭建了代理服务器来绕过天翼客户端的共享限制,然而经过实际测试还不够完美,所以本着生命不息,折腾不止的精神,我又开始研究搭建vpn服务器= =... (上次的 ...
- 《区块链:从入门到放弃》之obc安装步骤
obc安装步骤 朋友们可能会好奇,厨师不研究菜谱怎么改研究兵法了,哈哈,我原本是app出身,最近被安排去预研区块链和比特币技术,2个月下来,颇有斩获.期间得到IBM的CC同学指导我一步一步安装obc的 ...
随机推荐
- OK。第一个shell script 脚本
很简单吧.也很容易理解.读取两个字符放到变量firstname和lastname中,然后输出 编辑日期格式 上面是编辑日期格式.下面的例题是按照日期格式来分类创建文件
- vue 学习八 自定义指令
vue指令注册有两种方式 1 全局注册 在main.js中 使用vue.directive Vue.directive('alert_w', { inserted(el,bin,vn) { conso ...
- list集合获取相同以及不同的对象
List<StyleMenuModule> list1 = new ArrayList<>(); StyleMenuModule s1 = new StyleMenuModul ...
- CF566E Restoring Map
题意:乱序给你树上的每一个节点与之相距<=2的节点集合(并不知道这具体是哪个节点). 还原整棵树. 标程: #include<bits/stdc++.h> #define P pai ...
- 56. Map(双列集合)
在生活中有些数据是以映射关系存在的,也就是成对出现的,比如:老公 老婆(key-->value) 双列集合:-------------------| Map 如果是实现了Map接口的集合 ...
- UnixBench算分介绍
关于如何用UnixBench,介绍文章很多,这里就不展开了.这里重点描述下它是如何算分的. 运行参数 碰到很多客户,装好后,直接./Run,就把结果跑出来了,然后还只取最后一个分值,比谁高谁低.下面列 ...
- linux IPC socket
套接字是通讯端点的抽象 创建一个套接字 #include <sys/types.h> #include <sys/socket.h> int socket(int domain ...
- Shiro学习(3)授权
授权,也叫访问控制,即在应用中控制谁能访问哪些资源(如访问页面/编辑数据/页面操作等).在授权中需了解的几个关键对象:主体(Subject).资源(Resource).权限(Permission).角 ...
- Hbase节点的管理|服役和退役节点
Base节点的管理 1.服役(commissioning) 当启动regionserver时,regionserver会向Hmaster注册并开始接收本地数据,开始的时候,新加入的节点不会有任何数据, ...
- RobotFramework 切换窗口控制的用法小结
一:滚动条控制 应用场景:通过滚动条的上下,左右移动,才能让定位的元素可见.