当前位置:网站首页>C# 反射与Type
C# 反射与Type
2022-07-05 23:26:00 【廷益--飞鸟】
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace reflection
{
#region 知识点回顾
// 源语言程序: 某种程序设计语言写成的,比如C、C++、Java等语言写的程序
// 目标语言程序:二进制数表示的伪机器代码写的程序
#endregion
#region 程序集
// 程序集 就是我们写的一个代码集合
// 比如一个代码库文件(dll)或者 一个可执行文件(exe)
#endregion
#region 元数据
// 元数据 就是描述数据的数据
// 程序中的类,类中的函数、变量等等信息就是程序的 元数据
// 有关程序以及类型的数据被称为 元数据,它们保存在程序集中。
#endregion
#region 反射的概念
// 一个运行的程序查看本身或者其它程序的 元数据的行为 就叫做反射。
// 在程序运行时,通过反射可以得到其它程序集或者自己程序集代码的各种信息。
// 类、函数、变量、对象等等,实例化它们、执行它们、操作它们。
#endregion
#region 反射的作用
// 因为反射可以在 程序编译后 获得信息、所以它提高了程序的拓展性和灵活性。
// 1.程序运行时,得到所有元数据、包括元数据的特性
// 2.程序运行时,实例化对象、操作对象
// 3.程序运行时,可以创建新对象,用这些对象执行任务。
#endregion
class Test
{
private int i = 1;
public int j = 0;
public string str = "123";
public Test()
{
}
public Test(int i)
{
this.i = i;
}
public Test(int i, string str):this(i)
{
this.str = str;
}
public void Speek()
{
System.Console.WriteLine(i.ToString());
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("反射");
// 相关语法
#region Type
// type 类的信息类
// 是反射功能的基础.
// 它是访问元数据的主要方式。
// 使用Type 的成员获取有关类型声明的信息
// 有关类型的成员 (如构造函数、方法、字段、属性和类的事件)
#endregion
#region 获取Type
// 1.Object中 获取GetType() 可以获取对象的Type
int a = 38;
Type typeA = a.GetType();
Console.WriteLine("变量a的类型:" + typeA );
// 2.通过typeof关键字获取 传入类名
Type typeB = typeof(int);
Console.WriteLine("typeof 获取类型:" + typeB);
// 3.通过类的名字 获取Type
// 注意必须包含命名空间、不然找不到。
Type typeName = Type.GetType("System.Int32");
Console.WriteLine("类名 获取类型:" + typeName);
#endregion
#region 得到程序集信息
Console.WriteLine(typeA.Assembly);
Console.WriteLine(typeB.Assembly);
Console.WriteLine(typeName.Assembly);
#endregion
#region 获取类中的所有公共成员
// 首先得到Type
Type tTest = typeof(Test);
// 得到所有公共成员
// 需要引用命名空间 using System.Reflection;
MemberInfo[] infos = tTest.GetMembers();
foreach (MemberInfo item in infos)
{
Console.WriteLine(item);
}
#endregion
#region 获取类中的 公共构造函数并调用
// 1.获取所有构造函数
ConstructorInfo[] ctors = tTest.GetConstructors();
foreach (ConstructorInfo item in ctors)
{
Console.WriteLine(item);
}
// 2.获取其中一个构造函数 并执行
// 2-1. 无参构造
ConstructorInfo ctorInfo = tTest.GetConstructor(new Type[0]); // 传入 Type 数组
// 执行无参构造
Test obj = ctorInfo.Invoke(null) as Test; // 无参构造
Console.WriteLine(obj.j);
// 2-2. 得到有参构造
ConstructorInfo ctorInfo2 = tTest.GetConstructor(new Type[] {
typeof(int)});
// 执行无参构造
Test obj1 = ctorInfo2.Invoke(new object[] {
2 }) as Test; // 无参构造
obj1.Speek();
#endregion
#region 获取类中的 成员变量
// 1.获取所有成员变量
FieldInfo[] fieldInfos = tTest.GetFields();
foreach (FieldInfo item in fieldInfos)
{
Console.WriteLine(item);
}
// 2.得到指定名称的公共成员变量
FieldInfo fieldJ = tTest.GetField("j");
Console.WriteLine(fieldJ);
// 3.通过 成员变量获取对象的值
Test test = new Test();
test.j = 99;
test.str = "3333";
// 3-3 通过反射 获取对象的成员变量的值
Console.WriteLine(fieldJ.GetValue(test));
// 3-4 通过反射 设置对象的成员变量的值
fieldJ.SetValue(test, 101);
Console.WriteLine(fieldJ.GetValue(test));
#endregion
#region 获取类中的 方法
// 1.获取所有方法
Type strType = typeof(string);
MethodInfo[] methodInfos = strType.GetMethods();
foreach (MethodInfo item in methodInfos)
{
Console.WriteLine(item);
}
// 2.获取其中一个方法
MethodInfo strSub = strType.GetMethod("Substring",
new Type[] {
typeof(int), typeof(int)});
// 3.使用反射方式 调用方法
string strHl = "Hello world!";
// 如果是静态方法 第一个参数 设置为null
object result = strSub.Invoke(strHl, new object[] {
7, 5 });
Console.WriteLine(result);
#endregion
Console.ReadLine();
}
}
}
边栏推荐
- The interface of grafana tool displays an error, incluxdb error
- 6-axis and 9-axis IMU attitude estimation
- (4)UART应用设计及仿真验证2 —— RX模块设计(无状态机)
- Multi camera stereo calibration
- How to insert data into MySQL database- How can I insert data into a MySQL database?
- Fiddler Everywhere 3.2.1 Crack
- Rasa 3. X learning series -rasa x Community Edition (Free Edition) changes
- How to enable relationship view in phpMyAdmin - how to enable relationship view in phpMyAdmin
- [original] what is the core of programmer team management?
- 424. The longest repeated character after replacement ●●
猜你喜欢
Neural structured learning - Part 2: training with natural graphs
CIS基准测试工具kube-bench使用
Mathematical formula screenshot recognition artifact mathpix unlimited use tutorial
Neural structured learning 4 antagonistic learning for image classification
Spécifications techniques et lignes directrices pour la sélection des tubes TVS et ESD - Recommandation de jialichuang
保研笔记四 软件工程与计算卷二(8-12章)
开源crm客户关系统管理系统源码,免费分享
保研笔记一 软件工程与计算卷二(1-7章)
Dynamic planning: robbing families and houses
How to design API return code (error code)?
随机推荐
LeetCode——Add Binary
VS2010 writes DLL and unit test of dynamic link library, and transfers the correctness of DLL test
yate. conf
Naoqi robot summary 26
Summary of binary tree recursive routines
开源crm客户关系统管理系统源码,免费分享
When to use useImperativeHandle, useLayoutEffect, and useDebugValue
Use of shell:for loop
哪些偏门项目可以做到?自媒体做到月赚一万以上很难吗?
Go language implementation principle -- map implementation principle
Judge whether the binary tree is a complete binary tree
698. Divided into k equal subsets ●●
asp.net弹出层实例
asp. Net pop-up layer instance
ts类型声明declare
From the perspective of quantitative genetics, why do you get the bride price when you get married
MySQL (2) -- simple query, conditional query
698. 划分为k个相等的子集 ●●
MySQL delete uniqueness constraint unique
Rasa 3.x 学习系列-Rasa 3.2.1 新版本发布