首先,我们需要知道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#反射从入门到放弃(这部分遇到的新东西太多了让人接受不能)的更多相关文章

  1. Struts2入门到放弃

    写在前面------------------------------------------------------------------------- 本文章主要从三个方面来学习Struts2框架 ...

  2. dotnet 从入门到放弃的 500 篇文章合集

    本文是记录我从入门到放弃写的博客 博客包括 C#.WPF.UWP.dotnet core .git 和 VisualStudio 和一些算法,所有博客使用 docx 保存 下载:dotnet 从入门到 ...

  3. Go从入门到放弃

    Go语言介绍 为什么你应该学习Go语言? 开发环境准备 从零开始搭建Go语言开发环境 VS Code配置Go语言开发环境 Go语言基础 Go语言基础之变量和常量 Go语言基础之基本数据类型 Go语言基 ...

  4. 2018-8-10-dotnet-从入门到放弃的-500-篇文章合集

    title author date CreateTime categories dotnet 从入门到放弃的 500 篇文章合集 lindexi 2018-08-10 19:16:52 +0800 2 ...

  5. CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维

    前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...

  6. [精品书单] C#/.NET 学习之路——从入门到放弃

    C#/.NET 学习之路--从入门到放弃 此系列只包含 C#/CLR 学习,不包含应用框架(ASP.NET , WPF , WCF 等)及架构设计学习书籍和资料. C# 入门 <C# 本质论&g ...

  7. OpenStack从入门到放弃

    OpenStack从入门到放弃 目录: 为何选择云计算/云计算之前遇到的问题 什么是云计算 云服务模式 云应用形式 传统应用与云感知应用 openstack及其相关组件介绍 flat/vlan/gre ...

  8. 绕过校园网的共享限制 win10搭建VPN服务器实现--从入门到放弃

    一.开篇立论= =.. 上次说到博主在电脑上搭建了代理服务器来绕过天翼客户端的共享限制,然而经过实际测试还不够完美,所以本着生命不息,折腾不止的精神,我又开始研究搭建vpn服务器= =... (上次的 ...

  9. 《区块链:从入门到放弃》之obc安装步骤

    obc安装步骤 朋友们可能会好奇,厨师不研究菜谱怎么改研究兵法了,哈哈,我原本是app出身,最近被安排去预研区块链和比特币技术,2个月下来,颇有斩获.期间得到IBM的CC同学指导我一步一步安装obc的 ...

随机推荐

  1. nginx 和keepalived的使用

    今天看了培训视频,看到这俩玩意,挺有意思,先粘贴一下,别等到时候忘了. 官方网站 www.nginx.org nginx的特点 稳定版本是用偶数来做标记,测试版本使用奇数作为标记 通过yum来安装 安 ...

  2. Codeforces 348D DP + LGV定理

    题意及思路:https://www.cnblogs.com/chaoswr/p/9460378.html 代码: #include <bits/stdc++.h> #define LL l ...

  3. 使用SOAPui 笔记

    对接Oracle Fusion Application的SOAP. 遇到 <env:Envelope xmlns:env="http://schemas.xmlsoap.org/soa ...

  4. Nginx---配置详解(转发)

    转载于  http://baijiahao.baidu.com/s?id=1604485941272024493&wfr=spider&for=pc 1.概述 Nginx配置文件的整体 ...

  5. JDK1.8之后的新特性和新接口

    接口的旧特性: 就特性下接口中只有: 常量(必须赋值) 抽象方法abstract(和final static private三个关键字冲突) interface Inter { //int a ; / ...

  6. 一场comet常规赛的台前幕后

    有出题的想法大概是#8比完之后,#8的比赛较易,应该是符合https://info.cometoj.com 上的常规赛难度说明. 我们几个觉得我们一定可以出质量更高的题. 那个时候在玩线段树的时碰巧想 ...

  7. SCP-bzoj-1068

    项目编号:bzoj-1068 项目等级:Safe 项目描述: 戳这里 特殊收容措施: 区间DP.f[l][r][s]表示l到r的子串能最小被压成的长度,其中s∈[0,1]表示该串压缩后串中是否能含有M ...

  8. JSON.NET与LINQ序列化示例教程

    1.手动创建JSON对象和数组 JSON格式主要包括对象和数组两种形式,在JSON.NET中分别用JArray和JObject表示,属性用JProperty表示,属性值用 JValue表示,这些对象都 ...

  9. 30天轻松学习javaweb_修改tomcat的servlet模板

    在MyEclipse目录下搜索com.genuitec.eclipse.wizards 得到搜索结果 com.genuitec.eclipse.wizards_9.0.0.me201108091322 ...

  10. 兼容软件,Wine安装,Crossover安装,

    EL6 (RHEL6 and SL6) Required packages for proper building of 32-bit Wine on 64-bit EL6 yum install - ...