2024-06-10 · C# 基础 · 学习笔记

反射 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}");
}
学习小结:以上是我学习这个知识点时的笔记和心得。技术学习没有捷径,多写多练多踩坑,自然就掌握了。如果这篇笔记对你有帮助,欢迎继续看看其他文章。