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

反射的程序集生成.

 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        }