反射 Reflection 入门
反射可以在运行时获取类型信息:有哪些属性、方法、字段,并动态调用。它是序列化、依赖注入、ORM 等框架的底层基础。
自己用反射最多的场景是读取自定义特性和做对象映射。但反射有性能开销,比直接调用慢很多,不要在高频热路径用。
注意事项:1) 反射破坏封装,可以访问私有成员;2) 性能差,缓存 Type 和 PropertyInfo 可以缓解;3) AOT 场景反射受限。
代码示例
using System.Reflection;
// 获取类型信息
Type t = typeof(Person);
Console.WriteLine(t.Name); // Person
// 获取所有属性
PropertyInfo[] props = t.GetProperties();
foreach (var p in props)
Console.WriteLine($"属性:{p.Name} ({p.PropertyType.Name})");
// 动态读写属性
var person = new Person { Name = "Tom" };
PropertyInfo nameProp = t.GetProperty("Name");
// 读
object? val = nameProp.GetValue(person);
Console.WriteLine(val); // Tom
// 写
nameProp.SetValue(person, "Jerry");
Console.WriteLine(person.Name); // Jerry
// 动态调用方法
MethodInfo sayHi = t.GetMethod("SayHi")!;
sayHi.Invoke(person, null);
class Person
{
public string Name { get; set; } = "";
public void SayHi() => Console.WriteLine($"Hi, {Name}");
}
学习小结:以上是我学习这个知识点时的笔记和心得。技术学习没有捷径,多写多练多踩坑,自然就掌握了。如果这篇笔记对你有帮助,欢迎继续看看其他文章。