大数跨境
0
0

【C#基础语法回顾】反射的使用

【C#基础语法回顾】反射的使用 元讯趣编程
2022-05-04
2
导读:【C#基础语法回顾】反射的简单使用


微信公众号:趣编程ACE
关注可了解更多.Net日常开发技巧,如需源码请后台留言 源码;
如果觉得本公众号对您有帮助,欢迎关注

反射的程序集生成

 1public class Reflected
2    {
3
4        private  readonly string _name;
5        public readonly string _testField;
6
7        public string Name => _name;
8        public void Print()
9        
{
10            Console.WriteLine("开始打印");
11        }
12
13        public void Print(string name=> Console.WriteLine($"打印 Name:{name}");
14
15        public string GetName()=>this._name;
16
17
18        public void PrintName(=> Console.WriteLine($"Name set as {this._name}");
19
20
21
22        private void PrintPrivate(=> Console.WriteLine("打印私有");
23
24        public static void PrintStatic(=> Console.WriteLine("静态方法");
25
26        public static string StaticName => "静态属性";
27
28        //public void PrintTwoParameters(string name1,string name2)
29        //{
30        //    Console.WriteLine($"name1: {name1}- name2: {name2}");
31        //}
32
33
34    }

新建一个类库,编写如上这个需要反射获取信息的类,然后编译生成一个dll文件,将这个dll文件添加到主程序中,那么主程序如何调用呢?

主程序生成

 1static void Main(string[] args)
2        
{
3            Console.WriteLine("Hello World!");
4
5            var assembly = Assembly.LoadFrom(@"ReflectedInfo.dll");
6            //var assembly = Assembly.LoadFile(@"C:\Jarry\Code\公众号\反射\ReflectedInfo\bin\Debug\netcoreapp3.1\ReflectedInfo.dll");
7
8
9            foreach (var type in assembly.GetTypes())
10            {
11                Console.WriteLine($"类型如下:{type.Name}");
12                Console.WriteLine("==========================");
13
14                var instance = Activator.CreateInstance(type);
15
16
17                // PS 此处注意 BindingFlags.Instance 或者 BindingFlags.Static 不填默认是找不到除公有外的其余修饰类型的字段的
18                foreach (var field in type.GetFields(BindingFlags.NonPublic | BindingFlags.Instance
19                    | BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Static))
20                {
21                    Console.WriteLine($"field Name: {field.Name}");
22                    field.SetValue(instance, "test Field");
23                }
24                Console.WriteLine("======================");
25
26
27                // 获取方法  默认只会访问public 修饰的方法
28                foreach (var method in type.GetMethods(BindingFlags.NonPublic | BindingFlags.Public
29                    | BindingFlags.Instance | BindingFlags.DeclaredOnly | BindingFlags.Static).Where(m => !m.IsSpecialName))
30                {
31                    Console.WriteLine($"method name :{method.Name} -{method.ReturnType} --{method.DeclaringType}");
32                    if (method.GetParameters().Length > 0)
33                    {
34                        if (method.GetParameters().Length == 1)
35                        {
36                            method.Invoke(instance, new[] { "Jarry" });
37                        }
38                        else
39                        {
40                            method.Invoke(instance, new[] { "Jarry""Test" });
41                        }
42                    }else
43                    {
44                        method.Invoke(instance, null);
45                    }
46
47                }
48
49                Console.WriteLine("=====================");
50                // 获取属性
51                foreach (var property in type.GetProperties(BindingFlags.NonPublic | BindingFlags.Instance
52                    | BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.Static))
53                {
54                    Console.WriteLine($"property name:{property.Name}");
55
56                    var propretyValue = property.GetValue(instance);
57                    Console.WriteLine($"属性值是:{propretyValue}");
58                }
59            }
60
61
62        }

如上所示,详细讲解见视频~


【声明】内容源于网络
0
0
元讯趣编程
学习编程从入门到精通
内容 51
粉丝 0
元讯趣编程 学习编程从入门到精通
总阅读75
粉丝0
内容51