首页 > 其他分享 >在 Net7.0环境下通过反射创建对象和调用方法

在 Net7.0环境下通过反射创建对象和调用方法

时间:2023-09-20 11:24:15浏览次数:39  
标签:调用 string int 创建对象 var myType typeof Net7.0 new

一、介绍
    最近没事干,就用闲暇时间写点东西,也记录一下温习历程。老人说的好,好记性,不如烂笔头。时间一长,当时记忆的再清楚,都会变得模糊,索性就写博客记录下来,如果下次需要,直接打开博客就找到了,不用去网上乱找了。
    今天我要写一些有关反射创建类型实例和调用方法的文章,泛型的类型的创建和泛型方法的调用是普通类型(非泛型类型)的创建和调用还是有区别的,如果不知道,肯定会憋出一身臭汗,其实知道了,也没什么。怕时间长了,忘记。就把关键的代码写出来,为自己提个醒。
    测试环境说明:
          操作系统: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             }            


三、总结
    好了,写了不少了,其实这里不只是包含泛型类型,也包含其他的,私有方法的调用,静态方法的调用,重载方法和构造函数的调用,基本上都涉及到了,行了,以后有新的东西再写吧。每天努力一点点,老天不负有心人。

标签:调用,string,int,创建对象,var,myType,typeof,Net7.0,new
From: https://www.cnblogs.com/PatrickLiu/p/17716627.html

相关文章

  • SpringBoot + MDC 实现全链路调用日志跟踪
    简介:MDC(MappedDiagnosticContext,映射调试上下文)是log4j、logback及log4j2提供的一种方便在多线程条件下记录日志的功能。MDC可以看成是一个与当前线程绑定的哈希表,可以往其中添加键值对。MDC中包含的内容可以被同一线程中执行的代码所访问。当前线程的子线程会继承其父线......
  • WebAssembly实践指南——C++和Rust通过wasmtime实现相互调用实例
    C++和Rust通过wasmtime实现相互调用实例1wasmtime介绍wasmtime是一个可以运行WebAssembly代码的运行时环境。WebAssembly是一种可移植的二进制指令集格式,其本身与平台无关,类似于Java的class文件字节码。WebAssembly本来的设计初衷是想让浏览器可以运行C语言这种编译型语言的......
  • Python使用pyzabbix调用Zabbix API
    Zabbix是一个开源的提供分布式系统监视以及网络监视功能的解决方案。Zabbix能监视各种网络参数,监控服务器系统的安全运营状况,并提供灵活的通知机制以让服务器管理员快速定位和解决存在的各种问题。在使用Zabbix开始监控服务器后,Zabbix就会采集到服务器的各种网络参数,以及管理员......
  • 在 Net7.0环境下测试了 Assembly.Load、Assmebly.LoadFile和Assembly.LoadFrom的区别
    一、简介很长时间没有关注一些C#技术细节了,主要在研究微服务、容器、云原生、编批等高大上的主题了,最近在写一些框架的时候,遇到了一些和在NetFramework框架下不一样的情况,当然了,我今天主要测试的是,在通过【添加项目引用】和【手动拷贝DLL】的情况下,这三个方法加载程序......
  • 微服务远程调用 RestTemplate
    publicclassRostDispatchApplication{publicstaticvoidmain(String[]args){//下面语句使得日志输出使用异步处理,减小输出日志对性能的影响System.setProperty("Log4jContextSelector","org.apache.logging.log4j.core.async.AsyncLoggerContext......
  • 调用javascript的4钟方式
    <scripttype="text/javascript">document.write('调用方式一');</script><scriptlanguage="">document.write('调用方式二');</script><scriptlanguage="javascript">......
  • 9-微信小程序的网站的接口调用(直接调用)
    微信小程序除了在第三方调用接口,还可以直接从网站调用接口,但是每个网站都有保护措施,所以要寻找那些没有防护的,可以来直接调用的网站。 案例:豆瓣电影的接口调用1.百度豆瓣电源,找寻需要调用的页面 2.右键检查,或F12 3.回车,再次发起请求,查看网站接口 微信小程序作为新兴......
  • GOLANG:调用delphi7编写的dll
    0. delphi对winapi有很强的封装,使其更易用。1.delphi声明dll内函数需要尽量以此方式: proceduretest(data:pchar;count:integer);stdcall;2.golang调用方法:str:=[]byte("abcdedf")printTextDll:=syscall.NewLazyDLL("demo.dll")printBytes:=p......
  • 8-微信小程序的网站的接口调用
    案例:查询天气预报1.需要使用到的接口网址,在百度搜索聚合数据:https://www.juhe.cn/  聚合数据是一个请求接口的网站 准备工作做好后,就开始打开微信小程序编译器wxml:<view class="top" >    <text>查看天气预报</text></view><form bindsubmit="submit" >......
  • 《优化接口设计的思路》系列:第三篇—留下用户调用接口的痕迹
    前言大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。作为一名从业已达六年的老码农,我的工作主要是开发后端Java业务系统,包括各种管理后台和小程序等。在这些项目中,我设计过单/多租户......