反射的程序集生成.
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 }