动态编程入门第一节:C# 反射 - Unity 开发者的超级工具箱
动态编程入门第二节:委托与事件 - Unity 开发者的高级回调与通信艺术
动态编程入门第三节:表达式树 - 运行时构建代码,释放极致性能!
我们前面已经探讨了 C# 反射 的强大之处,以及 委托 和 事件 如何构建灵活的回调机制。我们还看到了 MethodInfo.Invoke() 在性能上的不足,以及 Delegate.CreateDelegate() 如何提供了一种更高效的替代方案。
然而,当我们需要在运行时执行更复杂的逻辑,或者动态构建更灵活的方法调用时,Delegate.CreateDelegate() 就不够用了。这时,我们需要更底层的“代码生成”工具——表达式树 (Expression Trees)!
表达式树就像是把你的 C# 代码语句,转换成了一种数据结构。你可以像操作普通数据一样,在运行时构建、修改这些代码结构,然后将它们编译成高性能的委托。这正是你的 UIManager 脚本中 CacheInitDelegate 方法能够高效初始化各种 Base 派生类脚本的奥秘!
1. 为什么需要表达式树?
让我们再次回到性能问题。当你通过反射调用方法时,例如:
methodInfo.Invoke(instance, new object[] { param1, param2 });
每次调用 Invoke,运行时都需要做很多工作:
- 查找
methodInfo对应的实际方法。 - 检查参数类型是否匹配,进行装箱/拆箱操作。
- 执行方法体。
这个过程涉及大量的运行时开销。而表达式树提供了一种“一劳永逸”的解决方案:它允许你在运行时动态地构建一个方法调用(或任何其他代码逻辑)的抽象语法树,然后将这个语法树一次性编译成一个可执行的委托。 一旦编译完成,这个委托的性能几乎与直接编写的代码相同。
简单来说:
- 反射
Invoke: 每次调用都“解释”一次。 - 表达式树: 运行时“编写”并“编译”一次,然后可以高效地“运行”多次。
2. 表达式树的核心概念
表达式树位于 System.Linq.Expressions 命名空间下。它由一系列 Expression 派生类的对象组成,每个对象代表了代码中的一个元素(如变量、常量、方法调用、属性访问、类型转换等)。
Expression: 所有表达式的基类。ParameterExpression: 表示方法的参数或局部变量。ConstantExpression: 表示常量值。MethodCallExpression: 表示方法调用。MemberExpression: 表示字段或属性访问。NewExpression: 表示构造函数调用(创建新对象)。UnaryExpression: 表示一元操作(如类型转换(T)、取反!)。LambdaExpression: 表示一个 Lambda 表达式,也是将表达式树编译成委托的入口。它包含表达式的主体和参数。
3. 构建与编译表达式树:一个动态初始化实例
为了更好地理解表达式树,我们暂时不直接使用我的框架中的 UIManager来举例,而是创建一个类似的场景:假设我们有一个通用的“组件初始化器”,它需要在运行时找到所有实现了 IInitializable 接口的组件,并调用它们的 Initialize() 方法。我们希望这个调用是高性能的。
首先,定义一个接口和一些示例组件:
// 1. 定义一个初始化接口
public interface IInitializable
{
void Initialize();
void InitializeWithParam(string message);
}
// 2. 示例组件A
public class ComponentA : MonoBehaviour, IInitializable
{
public void Initialize()
{
Debug.Log("ComponentA initialized!");
}
public void InitializeWithParam(string message)
{
Debug.Log($"ComponentA initialized with message: {
message}");
}
}
// 3. 示例组件B (可能是一个私有方法,反射和表达式树的优势)
public class ComponentB : MonoBehaviour, IInitializable
{
private void Initialize() // 私有方法
{
Debug.Log("ComponentB initialized privately!");
}
public void InitializeWithParam(string message)
{
Debug.Log(

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



