动态方法调用(DynamicMethod)
定义
命名空间:TouchSocket.Core
程序集:TouchSocket.Core.dll
一、核心概念
动态方法调用模块提供高效、灵活的方法反射调用方案,支持多种底层实现方式,显著提升反射调用性能。特别针对AOT(Ahead-of-Time)编译环境优化,同时保持传统反射场景的高性能表现。
二、核心特性
- 多引擎支持:
- IL代码生成(DynamicBuilderType.IL)
- 表达式树(DynamicBuilderType.Expression)
- 传统反射(DynamicBuilderType.Reflect)
- 源生成(DynamicBuilderType.SourceGenerator)
- 性能卓越:相比原生反射调用,IL模式提升100倍性能
- 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
);
构建器选择建议
- 开发阶段:使用IL生成获得最佳性能
- AOT环境:必须使用SourceGenerator
- 兼容性优先:选择Expression模式
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.InvokeObjectAsync(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"
五、性能优化
5.1 性能对比测试
// 执行1000万次调用性能测试
| 构建器类型 | 耗时(ms) |
|------------------|----------|
| IL生成 | 120 |
| 表达式树 | 450 |
| 源生成 | 150 |
| 传 统反射 | 5200 |
性能优势
- IL模式相比反射提升43倍性能
- 源生成模式在AOT环境下保持高性能
5.2 缓存策略
// 推荐在应用初始化时预加载方法
public static class MethodCache
{
public static readonly Method ProcessMethod = new Method(
typeof(MyClass),
nameof(MyClass.ProcessData),
DynamicBuilderType.IL
);
}
// 后续重复使用缓存实例
MethodCache.ProcessMethod.Invoke(instance);
六、高级用法
6.1 自定义特性标记
// 定义自定义特性
[AttributeUsage(AttributeTargets.Method)]
public class MyDynamicAttribute : DynamicMethodAttribute {}
// 标记方法
public class CustomService
{
[MyDynamic]
public void CustomOperation() { }
}
// 获取自定义标记方法
var methods = typeof(CustomService)
.GetMethods()
.Where(m => m.IsDefined(typeof(MyDynamicAttribute)));