C#反射

反射就是操作C#代码编译后的dll文件,可以获取程序集中的所有数据,并调用运行时类的方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
static void Main(string[] args)
{
// 方式一:通过加载dll文件获取指定Type
Assembly assembly = Assembly.LoadFrom("Library.dll");
Type type = assembly.GetType("Libaray.Student");

// 获取所有Type
var types = assembly.GetTypes();
foreach (Type t in types)
{
Console.WriteLine(t.Name);
}

// 方式二:通过typeof() 获取Type
Type type1 = typeof(Libaray.Student);

// 调用无参构造
object student = Activator.CreateInstance(type);
Console.WriteLine(student);

// 调用有参构造
object student1 = Activator.CreateInstance(type, new object[] { "2017001", "zhangyuzhen", 22 });
Console.WriteLine(student1);

// 调用私有构造
object student2 = Activator.CreateInstance(type, true);
Console.WriteLine(student2);

// 调用方法
var method = type.GetMethod("Print", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
method.Invoke(student2,new object[] { "zyz",22});

// 调用泛型方法
var method1 = type.GetMethod("Func", BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic);
var genericMethod = method1.MakeGenericMethod(new Type[] { typeof(int) });
genericMethod.Invoke(student2, new object[] {});

// 获取所有属性并设置值
var properties = type.GetProperties();
foreach(var property in properties){
if (property.Name == "Id")
{
property.SetValue(student, "001");
}else if (property.Name == "Name")
{
property.SetValue(student, "zhangsan");
}
else
{
property.SetValue(student, 18);
}
}
Console.WriteLine(student);
}