首先,我们需要知道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. 2018-2-13-git-cannot-lock-ref

    title author date CreateTime categories git cannot lock ref lindexi 2018-2-13 17:23:3 +0800 2018-2-1 ...

  2. 关于STLINK

    关于STLINK 1.STLIN固件升级 1)打开ST-LINK Utility,选择ST-LINK->Firmware update 2)连接ST-LINK 3)可以看到STLINK当前的软件 ...

  3. 牛客多校第六场-H-Pair

    链接:https://ac.nowcoder.com/acm/contest/887/H来源:牛客网 题目描述 Given three integers A, B, C. Count the numb ...

  4. transformer模型计算图

    参考了这篇文章:http://nlp.seas.harvard.edu/2018/04/03/attention.html 结合代码和图,能更加清楚的了解transformer中的一些原理(ps,等下 ...

  5. K8S集群安装部署

    K8S集群安装部署   参考地址:https://www.cnblogs.com/xkops/p/6169034.html 1. 确保系统已经安装epel-release源 # yum -y inst ...

  6. 【时间】Unix时间戳

    UNIX时间戳:Unix时间戳(英文为Unix epoch, Unix time, POSIX time 或 Unix timestamp) 是从1970年1月1日(UTC/GMT的午夜)开始所经过的 ...

  7. bzoj1066题解

    [解题思路] 考虑拆点,把每根石柱拆成两个点,具体可以理解为石柱底部和石柱顶部,能爬到石柱顶部的蜥蜴只有有限只,而且蜥蜴只有爬到了石柱顶部才能跳到其他石柱的底部. 这样,考虑如下建图: 将每个有蜥蜴的 ...

  8. 前台页面中json和字符串相互转化

    比如我有两个变量,我要将a转换成字符串,将b转换成JSON对象: var a={"name":"tom","sex":"男&quo ...

  9. CSS:CSS 伪元素

    ylbtech-CSS:CSS 伪元素 1.返回顶部 1. CSS 伪元素 CSS伪元素是用来添加一些选择器的特殊效果. 语法 伪元素的语法: selector:pseudo-element {pro ...

  10. 关于类中的参数类型和return返回值

    基础有些忘了,现在重新巩固一下 先定义一个Person类 class Person(): def __init__(self,name,age,height): self.name=name, sel ...