动态方法调用(DynamicMethod)
定义
命名空间:TouchSocket.Core
程序集:TouchSocket.Core.dll
一、核心概念
动态方法调用模块提供高效、灵活的方法反射调用方案,支持多种底层实现方式,显著提升反射调用性能。特别针对AOT(Ahead-of-Time)编译环境优化,同时保持传统反射场景的高性能表现。
二、核心特性
- 多引擎支持:
- IL代码生成(DynamicBuilderType.IL)
- 表达式树(DynamicBuilderType.Expression)
- 传统反射(DynamicBuilderType.Reflect)
- 源生成(DynamicBuilderType.SourceGenerator)
- 性能卓越:相比原生反射调用,性能提升10倍性能
- AOT友好:源生成模式实现零反射,完美支持iOS/Android等AOT环境
- 智能异步支持:自动识别Task/ValueTask返回值类型
- 全参数支持:支持ref/out参数、泛型参数、参数默认值
- 灵活扩展:支持自定义动态方法特性标记
三、快速开始
3.1 基本声明
public class MyClass
{
[DynamicMethod]
public void SimpleMethod()
{
Console.WriteLine("Method executed");
}
}
3.2 基础调用
// 创建方法包装器
var method = new Method(typeof(MyClass), nameof(MyClass.SimpleMethod));
// 实例化对象
var instance = new MyClass();
// 执行方法调用
method.Invoke(instance);
四、核心功能详解
4.1 构建器类型选择
// 使用IL生成
var ilMethod = new Method(
typeof(MyClass),
nameof(MyClass.SimpleMethod),
DynamicBuilderType.IL
);
// 使用表达式树
var exprMethod = new Method(
typeof(MyClass),
nameof(MyClass.SimpleMethod),
DynamicBuilderType.Expression
);
// 使用源生成(性能最强,AOT环境推荐)
var sourceGenMethod = new Method(
typeof(MyClass),
nameof(MyClass.SimpleMethod),
DynamicBuilderType.SourceGenerator
);
构建器选择建议
- 任何时候:使用SourceGenerator,无论性能还是AOT环境,都是首选。
4.2 异步方法支持
public class MyClass
{
[DynamicMethod]
public async Task<int> GetDataAsync()
{
await Task.Delay(100);
return 42;
}
}
// 异步调用
var method = new Method(typeof(MyClass), nameof(MyClass.GetDataAsync));
var result = await method.InvokeAsync(instance);
Console.WriteLine($"Result: {result}"); // 输出 42
4.3 复杂参数处理
public class MyClass
{
[DynamicMethod]
public void ProcessData(
string input,
ref int counter,
out string result)
{
counter++;
result = $"{input}_{counter}";
}
}
// 调用示例
var parameters = new object[] { "data", 0, null };
method.Invoke(instance, parameters);
Console.WriteLine($"Result: {parameters[2]}"); // 输出 "data_1"