在 Net7.0环境下通过反射创建泛型实例和调用泛型方法
一、介绍
最近没事干,就用闲暇时间写点东西,也记录一下温习历程。老人说的好,好记性,不如烂笔头。时间一长,当时记忆的再清楚,都会变得模糊,索性就写博客记录下来,如果下次需要,直接打开博客就找到了,不用去网上乱找了。
今天我要写一些有关反射和泛型的关系,泛型的类型的创建和泛型方法的调用是普通类型(非泛型类型)的创建和调用还是有区别的,如果不知道,肯定会憋出一身臭汗,其实知道了,也没什么。怕时间长了,忘记。就把关键的代码写出来,为自己提个醒。
测试环境说明:
操作系统:Windows10 Professinal
开发工具:Visual Studio 2022
测试平台:Windows Console Application
框架平台:Net 7.0
二、我的代码
我的测试很简单,分为两种,一种是泛型类型的创建和实例化,第二种是泛型方法的调用。当然了,泛型方法的调用,也区分为:泛型类型的泛型方法的调用和非泛型类型的泛型方法的调用,废话不多说,直接上代码。
当然有泛型的创建使用,还有其他类型的访问,把所有情况都包好了。
辅助类型:
1 /// <summary>
2 /// 非泛型类型的泛型方法反射调用。
3 /// </summary>
4 internal class InstanceGenericMethod
5 {
6 /// <summary>
7 /// 泛型方法不是生成占位符。
8 /// </summary>
9 /// <typeparam name="T"></typeparam>
10 /// <typeparam name="S"></typeparam>
11 /// <param name="parameter"></param>
12 /// <param name="s"></param>
13 /// <returns></returns>
14 public T Generate<T, S>(T parameter, S s)
15 {
16 Console.WriteLine("非泛型类-泛型方法:Generate<T, S>(T parameter, S s) 执行");
17 return parameter;
18 }
19 }
20
21 /// <summary>
22 /// 泛型类型的泛型方法反射调用。
23 /// </summary>
24 /// <typeparam name="X"></typeparam>
25 internal class GenericClassMethod<X>
26 {
27 /// <summary>
28 ///
29 /// </summary>
30 /// <typeparam name="T"></typeparam>
31 /// <typeparam name="S"></typeparam>
32 /// <param name="parameter"></param>
33 /// <param name="s"></param>
34 /// <returns></returns>
35 public X Generate<T, S>(X x, T t, S s)
36 {
37 Console.WriteLine("泛型类-泛型方法:Generate<T, S>(T parameter, S s) 执行");
38 return x;
39 }
40 }
实例方法调用类型:
1 /// <summary>
2 /// 针对实例类型方法反射的调用,包含重载方法的反射调用。
3 /// </summary>
4 internal class InstanceMethod
5 {
6 /// <summary>
7 /// 无参唯一实例方法。
8 /// </summary>
9 public void Process()
10 {
11 Console.WriteLine("Process()无参实例方法执行。");
12 }
13
14 /// <summary>
15 /// 多参实例方法。
16 /// </summary>
17 /// <param name="age"></param>
18 /// <param name="name"></param>
19 /// <param name="dateTime"></param>
20 public void DoSomething(int age,string name,DateTime dateTime)
21 {
22 Console.WriteLine("DoSomething(int age,string name,DateTime dateTime)多参实例方法执行。");
23 }
24
25 /// <summary>
26 /// 重载方法
27 /// </summary>
28 public void Generate()
29 {
30 Console.WriteLine($"Generate()");
31 }
32
33 /// <summary>
34 /// 重载方法
35 /// </summary>
36 /// <param name="age"></param>
37 /// <param name="name"></param>
38 public void Generate(int age,string name)
39 {
40 Console.WriteLine($"Generate(int age,string name)");
41 }
42
43 /// <summary>
44 /// 重载方法
45 /// </summary>
46 /// <param name="age"></param>
47 /// <param name="name"></param>
48 /// <param name="stream"></param>
49 public void Generate(int age, string name, Stream stream)
50 {
51 Console.WriteLine($"Generate(int age, string name, Stream stream)已执行");
52 }
53
54 /// <summary>
55 /// 有返回值的重载方法
56 /// </summary>
57 /// <param name="age"></param>
58 /// <param name="name"></param>
59 /// <param name="stream"></param>
60 public decimal Generate(int age, string name, Stream stream,decimal money)
61 {
62 Console.WriteLine($" Generate(int age, string name, Stream stream,decimal money) 已执行");
63 return money;
64 }
65 }
使用静态和实例方法反射调用的类型:
1 /// <summary>
2 /// 通过反射调用私有方法。
3 /// </summary>
4 internal class PrivateMethodDemo
5 {
6 /// <summary>
7 /// 有参数的实例私有方法。
8 /// </summary>
9 /// <param name="age"></param>
10 /// <param name="name"></param>
11 private void PrivateInstanceMethodTest(int age, string name)
12 {
13 Console.WriteLine($"实例方法:年龄:{age};姓名:{name}");
14 }
15
16 /// <summary>
17 /// 有参数的静态私有方法。
18 /// </summary>
19 /// <param name="age"></param>
20 /// <param name="name"></param>
21 private static void PrivateStaticMethodTest(int age, string name)
22 {
23 Console.WriteLine($"静态方法:年龄:{age};姓名:{name}");
24 }
25 }
静态方法反射调用的类型:
1 /// <summary>
2 /// 静态方法反射调用,包含重载静态方法
3 /// </summary>
4 internal class StaticMethod
5 {
6 /// <summary>
7 ///
8 /// </summary>
9 public static void Process()
10 {
11 Console.WriteLine("Process()无参实例方法执行。");
12 }
13
14 /// <summary>
15 ///
16 /// </summary>
17 /// <param name="age"></param>
18 /// <param name="name"></param>
19 /// <param name="dateTime"></param>
20 public static void DoSomething(int age, string name, DateTime dateTime)
21 {
22 Console.WriteLine("DoSomething(int age,string name,DateTime dateTime)多参实例方法执行。");
23 }
24
25 /// <summary>
26 /// 重载方法
27 /// </summary>
28 public static void Generate()
29 {
30 Console.WriteLine("重载方法:Generate() 方法执行。");
31 }
32
33 /// <summary>
34 /// 重载方法
35 /// </summary>
36 /// <param name="age"></param>
37 /// <param name="name"></param>
38 public static void Generate(int age, string name)
39 {
40 Console.WriteLine("重载方法:Generate(int age, string name) 方法执行。");
41 }
42
43 /// <summary>
44 /// 重载方法
45 /// </summary>
46 /// <param name="age"></param>
47 /// <param name="name"></param>
48 /// <param name="stream"></param>
49 public static void Generate(int age, string name, Stream stream)
50 {
51 Console.WriteLine("重载方法:Generate(int age, string name, Stream stream) 方法执行。");
52 }
53
54 /// <summary>
55 /// 有返回值的重载方法
56 /// </summary>
57 /// <param name="age"></param>
58 /// <param name="name"></param>
59 /// <param name="stream"></param>
60 public static decimal Generate(int age, string name, Stream stream, decimal money)
61 {
62 Console.WriteLine("重载方法:Generate(int age, string name, Stream stream, decimal money) 方法执行。");
63 return money;
64 }
65 }
反射调用重载构造函数的类型:
1 /// <summary>
2 /// 反射调用重载构造函数
3 /// </summary>
4 internal class MultiCtorDemo
5 {
6 private readonly string? name;
7 private readonly DateTime dateTime;
8 private readonly int age;
9
10 /// <summary>
11 /// 无参构造函数
12 /// </summary>
13 public MultiCtorDemo()
14 {
15
16 }
17
18 /// <summary>
19 /// 重载构造函数
20 /// </summary>
21 /// <param name="name"></param>
22 public MultiCtorDemo(string name)
23 {
24 this.name = name;
25 }
26
27 /// <summary>
28 /// 重载构造函数
29 /// </summary>
30 /// <param name="age"></param>
31 public MultiCtorDemo(int age)
32 {
33 this.age = age;
34 }
35
36 /// <summary>
37 /// 重载构造函数
38 /// </summary>
39 /// <param name="age"></param>
40 /// <param name="name"></param>
41 /// <param name="dateTime"></param>
42 public MultiCtorDemo(int age,string name,DateTime dateTime)
43 {
44 this.age = age;
45 this.name = name;
46 this.dateTime = dateTime;
47 }
48 }
私有和受保护的构造函数反射调用的类型:
1 /// <summary>
2 /// 私有和受保护的构造函数反射调用
3 /// </summary>
4 internal class PrivateCtorDemo
5 {
6 private readonly int age;
7
8 /// <summary>
9 /// 私有构造函数
10 /// </summary>
11 private PrivateCtorDemo() { }
12
13 /// <summary>
14 /// 受保护的构造函数
15 /// </summary>
16 /// <param name="age"></param>
17 protected PrivateCtorDemo(int age)
18 {
19 this.age = age;
20 }
21 }
测试代码:
1 //202309181126、多构造函数反射调用
2 {
3 Assembly assembly = Assembly.Load("PatrickLiu.DelegateDeep.AllStudy");
4 var myType = assembly.GetType("PatrickLiu.DelegateDeep.AllStudy.Reflections.MultiCtorDemo");
5 if (myType != null)
6 {
7 var instance = Activator.CreateInstance(myType);
8 var instance2 = Activator.CreateInstance(myType, new object[] { "刘雷" });
9 var instance3 = Activator.CreateInstance(myType, new object[] { 123 });
10 var instance4 = Activator.CreateInstance(myType, new object[] { 123, "黄飞虎", DateTime.Now });
11 }
12 }
13
14 //202309181135、私有构造函数反射调用(只有无参构造函数)
15 {
16 Assembly assembly = Assembly.Load("PatrickLiu.DelegateDeep.AllStudy");
17 var myType = assembly.GetType("PatrickLiu.DelegateDeep.AllStudy.Reflections.PrivateCtorDemo");
18 if (myType != null)
19 {
20 var obj = Activator.CreateInstance(myType, true);
21 }
22 }
23
24 //202309181151、泛型类型的反射实例
25 {
26 Assembly assembly = Assembly.Load("PatrickLiu.DelegateDeep.AllStudy");
27 var myType = assembly.GetType("PatrickLiu.DelegateDeep.AllStudy.Reflections.ReflectionGenericDemo`4");
28 if (myType != null)
29 {
30 var genericType = myType.MakeGenericType(new Type[] { typeof(int), typeof(string), typeof(float), typeof(decimal), });
31 var obj = Activator.CreateInstance(genericType);
32 }
33 }
34
35 //202309181309、实例方法反射调用
36 {
37 Assembly assembly = Assembly.Load("PatrickLiu.DelegateDeep.AllStudy");
38 var myType = assembly.GetType("PatrickLiu.DelegateDeep.AllStudy.Reflections.Methods.InstanceMethod");
39 if (myType != null)
40 {
41 var myInstance = Activator.CreateInstance(myType);
42 if (myInstance != null)
43 {
44 var method = myType.GetMethod("Process");
45 method!.Invoke(myInstance, null);
46
47 var method2 = myType.GetMethod("DoSomething", new Type[] { typeof(int), typeof(string), typeof(DateTime) });
48 method2!.Invoke(myInstance, new object[] { 112233, "刘雷", DateTime.Now });
49 }
50 }
51 }
52
53 //202309181330、实例重载方法反射调用
54 {
55 Assembly assembly = Assembly.Load("PatrickLiu.DelegateDeep.AllStudy");
56 var myType = assembly.GetType("PatrickLiu.DelegateDeep.AllStudy.Reflections.Methods.InstanceMethod");
57 if (myType != null)
58 {
59 var myInstance = Activator.CreateInstance(myType);
60 if (myInstance != null)
61 {
62 var method = myType.GetMethod("Generate", new Type[] { });
63 method!.Invoke(myInstance, null);
64
65 var method2 = myType.GetMethod("Generate", new Type[] { typeof(int), typeof(string) });
66 method2!.Invoke(myInstance, new object[] { 112233, "刘雷" });
67
68 var method3 = myType.GetMethod("Generate", new Type[] { typeof(int), typeof(string), typeof(Stream) });
69 method3!.Invoke(myInstance, new object[] { 112233, "刘雷", null });
70
71 var method4 = myType.GetMethod("Generate", new Type[] { typeof(int), typeof(string), typeof(Stream), typeof(decimal) });
72 var value = method4!.Invoke(myInstance, new object[] { 112233, "刘雷", null, 4933m });
73 Console.WriteLine(value);
74 }
75 }
76 }
77
78 //202309181345、静态方法、重载方法反射调用(实例对象为空)
79 {
80 Assembly assembly = Assembly.Load("PatrickLiu.DelegateDeep.AllStudy");
81 var myType = assembly.GetType("PatrickLiu.DelegateDeep.AllStudy.Reflections.Methods.StaticMethod");
82 if (myType != null)
83 {
84 var staticProcess = myType.GetMethod("Process");
85 staticProcess!.Invoke(null, null);
86
87 var staticDoSomething = myType.GetMethod("DoSomething", new Type[] { typeof(int), typeof(string), typeof(DateTime) });
88 staticDoSomething!.Invoke(null, new object[] { 123, "dddd", DateTime.Now });
89
90 var staticGenerate = myType.GetMethod("Generate", new Type[] { });
91 staticGenerate!.Invoke(null, null);
92
93 var staticGenerate2 = myType.GetMethod("Generate", new Type[] { typeof(int), typeof(string) });
94 staticGenerate2!.Invoke(null, new object[] { 123, "123" });
95
96 var staticGenerate3 = myType.GetMethod("Generate", new Type[] { typeof(int), typeof(string), typeof(Stream) });
97 staticGenerate3!.Invoke(null, new object[] { 123, "123", null });
98
99 var staticGenerate4 = myType.GetMethod("Generate", new Type[] { typeof(int), typeof(string), typeof(Stream), typeof(decimal) });
100 var value = staticGenerate4!.Invoke(null, new object[] { 123, "123", null, 2345m });
101 Console.WriteLine(value);
102 }
103 }
104
105 //202309181345、静态方法、重载方法反射调用(实例对象不为空)
106 {
107 Assembly assembly = Assembly.Load("PatrickLiu.DelegateDeep.AllStudy");
108 var myType = assembly.GetType("PatrickLiu.DelegateDeep.AllStudy.Reflections.Methods.StaticMethod");
109 if (myType != null)
110 {
111 var instance = Activator.CreateInstance(myType);
112 var staticProcess = myType.GetMethod("Process");
113 staticProcess!.Invoke(instance, null);
114
115 var staticDoSomething = myType.GetMethod("DoSomething", new Type[] { typeof(int), typeof(string), typeof(DateTime) });
116 staticDoSomething!.Invoke(instance, new object[] { 123, "dddd", DateTime.Now });
117
118 var staticGenerate = myType.GetMethod("Generate", new Type[] { });
119 staticGenerate!.Invoke(instance, null);
120
121 var staticGenerate2 = myType.GetMethod("Generate", new Type[] { typeof(int), typeof(string) });
122 staticGenerate2!.Invoke(instance, new object[] { 123, "123" });
123
124 var staticGenerate3 = myType.GetMethod("Generate", new Type[] { typeof(int), typeof(string), typeof(Stream) });
125 staticGenerate3!.Invoke(instance, new object[] { 123, "123", null });
126
127 var staticGenerate4 = myType.GetMethod("Generate", new Type[] { typeof(int), typeof(string), typeof(Stream), typeof(decimal) });
128 var value = staticGenerate4!.Invoke(instance, new object[] { 123, "123", null, 2345m });
129 Console.WriteLine(value);
130 }
131 }
132
133 //202309181349、泛型方法反射调用
134 {
135 //非泛型类型的泛型方法反射调用。
136 {
137 Assembly assembly = Assembly.Load("PatrickLiu.DelegateDeep.AllStudy");
138 var type = assembly.GetType("PatrickLiu.DelegateDeep.AllStudy.Reflections.Methods.InstanceGenericMethod");
139 if (type != null)
140 {
141 var instance = Activator.CreateInstance(type);
142 if (instance != null)
143 {
144 var method = type.GetMethod("Generate");
145 var genericMethod = method!.MakeGenericMethod(typeof(int), typeof(string));
146 var value = genericMethod.Invoke(instance, new object[] { 123, "魏延" });
147 Console.WriteLine(value);
148 }
149 }
150 }
151
152 //泛型类型的泛型方法反射调用。
153 {
154 Assembly assembly = Assembly.Load("PatrickLiu.DelegateDeep.AllStudy");
155 var type = assembly.GetType("PatrickLiu.DelegateDeep.AllStudy.Reflections.Methods.GenericClassMethod`1");
156 if (type != null)
157 {
158 var genericType = type.MakeGenericType(new Type[] { typeof(int) });
159 var instance = Activator.CreateInstance(genericType);
160 if (instance != null)
161 {
162 var method = genericType.GetMethod("Generate");
163 var genericMethod = method!.MakeGenericMethod(typeof(int), typeof(string));
164 var value = genericMethod.Invoke(instance, new object[] { 123, 456, "魏延" });
165 Console.WriteLine(value);
166 }
167 }
168 }
169 }
170
171 //202309191105、反射调用静态和实例私有方法
172 {
173 Assembly assembly = Assembly.Load("PatrickLiu.DelegateDeep.AllStudy");
174 var type = assembly.GetType("PatrickLiu.DelegateDeep.AllStudy.Reflections.Methods.PrivateMethodDemo");
175 if (type != null)
176 {
177 var instance = Activator.CreateInstance(type);
178 if (instance != null)
179 {
180 var privateInstanceMethod = type.GetMethod("PrivateInstanceMethodTest", BindingFlags.NonPublic|BindingFlags.Instance);
181 privateInstanceMethod?.Invoke(instance,new object[] {123,"魏文长" });
182
183 var privateStaticMethod = type.GetMethod("PrivateStaticMethodTest", BindingFlags.NonPublic | BindingFlags.Static);
184 privateStaticMethod?.Invoke(instance, new object[] { 123, "魏文长" });
185 }
186 }
187 }
三、总结
好了,写了不少了,其实这里不只是包含泛型类型,也包含其他的,私有方法的调用,静态方法的调用,重载方法和构造函数的调用,基本上都涉及到了,行了,以后有新的东西再写吧。每天努力一点点,老天不负有心人。
在 Net7.0环境下通过反射创建泛型实例和调用泛型方法的更多相关文章
- CentOS7 Zabbix4.0环境下的安装和配置实例
1.安装准备 Zabbix4.0对基础架构有一定的要求,对的英文尤其PHP状语从句:MySQL: 类型 内容 服务端运行环境 Linux和PHP与Web服务器和数据库 服务端操作系统 CentOS7. ...
- VB6.0环境下的CATIA二次开发简介
CATIA作为CAD/CAE/CAM/PDM一体化的软件,广泛用于航空航天.汽车.船舶及电子工业,尤其在航空航天业,有八成以上厂商使用CATIA的市场[11].然而由于使用习惯和使用的侧重点不用,功能 ...
- [VS2015].NET4.0环境下使用.NET2.0程序集,使用sqlite时报异常 出现“混合模式程序集异常”
在.net 4.0环境下使用sqlite时报异常 混合模式程序集是针对“v2.0.50727”版的运行时生成的,在没有配置其他信息的情况下,无法在 4.0 运行时中加载该程序集其调用的方法是从sqli ...
- Windows-Server-2008、IIS7.0环境下配置伪静态化
在Windows-Server-2008.IIS7.0环境下配置伪静态化 首先,是IIS7.0的配置,由于Windows Server 2008操作系统默认的IIS版本为 ...
- 使用zipkin2在SpringCloud2.0环境下追踪服务调用情况
1.目的: 使用zipkin2.0在Spring Cloud 2.0环境下,追踪服务调用情况. 2.所需组件: zipkin2.0,Spring Cloud 2.0,Eureka Server,Eur ...
- VC++6.0环境下调试c语言代码的方法和步骤_附图
1.C语言程序四步开发步骤 (1)编辑.可以用任何一种编辑软件将在纸上编写好的C语言程序输入计算机,并将C语言源程序文件*.c以纯文本文件形式保存在计算机的磁盘上(不能设置字体.字号等). (2)编译 ...
- 转 Visual C++6.0 与matlab联合编程(2)----Visual C++6.0 环境下编译和调试MEX文件
我的最初想法是利用matlab的mex命令调用C++程序生成动态链接库的,但是测试程序(文中另附)通过了,自己的实际应用程序却没有过.还是把方法贴在这儿,以便自己以后进行整理. http://shij ...
- Android开发之 Windows环境下通过Eclipse创建的第一个安卓应用程序(图文详细步骤)
第一篇 windows环境下搭建创建的第一个安卓应用程序 为了方便,我这里只采用了一体包进行演示. 一.下载安卓环境的一体包. 官网下载:安卓官网(一般被墙了) 网盘下载: http://yunpa ...
- win10环境下为mongoDB创建用户并认证登录
一.配置mongoDB的bin目录到环境变量中的path;例如:D:\DatabaseService\MongoDB\Server\4.0\bin 二.cmd打开控制台,然后输入mongo回车,可以进 ...
- Hadoop2.2.0环境下Sqoop1.99.3安装
本文转载自http://blog.csdn.net/liuwenbo0920/article/details/40504045 1.安装准备工作: 已经装好的hadoop环境是hadoop 2.2.0 ...
随机推荐
- Python潮流周刊#5:并发一百万个任务要用多少内存?
你好,我是猫哥.这里记录每周值得分享的 Python 及通用技术内容,部分为英文,已在小标题注明.(标题取自其中一则分享,不代表全部内容都是该主题,特此声明.) 博客原文:https://python ...
- Anaconda入门使用指南(一)
python 是目前最流程的编程语言之一,但对于很多初学者而言,python 的包.环境以及版本的管理却是一个令人头疼的问题,特别是对于使用 Windows 的童鞋.为了解决这些问题,有不少发行版的 ...
- ensp 链路聚合
链路聚合(Link Aggregation) 指将多个物理端口汇聚在一起,形成一个逻辑端口,以实现出/入流量吞吐量在各成员端口的负荷分担,链路聚合在增加链路带宽.实现链路传输弹性和工程冗余等方面是 ...
- 常量接口 vs 常量类 vs 枚举区别
把常量定义在接口里与类里都能通过编译,那2者到底有什么区别呢? 那个更合理? 常量接口 public interface ConstInterfaceA { public static final S ...
- 分享6个SQL小技巧
原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,非公众号转载保留此声明. 简介 经常有小哥发出疑问,SQL还能这么写?我经常笑着回应,SQL确实可以这么写.其实SQL学起来简单,用起来也 ...
- XTTS系列之五:警惕大文件表空间
在上篇<XTTS系列之四:迷迷糊糊的并行度>验证之后,就让测试组在RMAN配置中设置好正确的并行.然后重新将备份任务执行,平均速度直接由之前的150MB/s提升为1200MB/s.优化效果 ...
- 【SpringBoot】注解
Controller - @RestController - @RequestMapping("/path") Controller内方法 @GetMapping("/p ...
- 【技术积累】Mysql中的SQL语言【技术篇】【三】
聚合函数 SUM函数 在MySQL中,SUM函数是用于计算数值列的总和的聚合函数.它接受一个数值列作为参数,并返回该列中所有值的总和. 以下是一个使用SUM函数的示例: 假设我们有一个名为" ...
- Hexo博客yilia主题文章添加目录
参考文章 添加目录的文章有一些是自己添加css文件和修主题配置 作者也更新了文章大体目录的功能 打开配置文件themes/yilia/_config.yml 你可以选择toc设置为1 或者2 toc: ...
- 防火墙(iptables与firewalld)
防火墙 iptables 疏通和堵 进行路由选择前处理的数据包:prerouting 处理流入的数据包:input 处理流出的数据包:output 处理转发的数据包:forward 进行路由选择后处理 ...