在 C# 中,通过反射获取到的方法可以使用异步调用。以下是一种实现异步调用反射方法的示例代码:
using System;
using System.Reflection;
using System.Threading.Tasks;
public class Program
{
public static async Task Main()
{
// 获取方法所在的类型
Type type = typeof(MyClass);
// 创建类型的实例
object instance = Activator.CreateInstance(type);
// 获取方法信息
MethodInfo methodInfo = type.GetMethod("MyMethod");
// 检查方法是否可异步调用
if (methodInfo.ReturnType == typeof(Task))
{
// 调用异步方法
Task task = (Task)methodInfo.Invoke(instance, null);
// 等待异步方法完成
await task;
}
else if (methodInfo.ReturnType.IsGenericType && methodInfo.ReturnType.GetGenericTypeDefinition() == typeof(Task<>))
{
// 调用异步方法
dynamic task = methodInfo.Invoke(instance, null);
// 等待异步方法完成并获取结果
dynamic result = await task;
// 使用结果
Console.WriteLine(result);
}
}
}
public class MyClass
{
public async Task MyMethod()
{
// 异步方法的实现
await Task.Delay(1000);
Console.WriteLine("Async method completed.");
}
}
在上面的示例中,我们通过反射获取到了名为 "MyMethod" 的方法,并判断其返回类型来确定它是否为异步方法。如果返回类型是 Task
,则使用 (Task)methodInfo.Invoke(instance, null)
异步调用方法并等待其完成。如果返回类型是泛型类型 Task<T>
,则使用 dynamic
类型来调用异步方法并等待其完成,并获取到结果后进行处理。
请注意,如果你要使用异步方法的返回值,需要在调用异步方法之前使用 await
关键字等待异步方法完成,并根据需要处理异步方法的返回值。
评论 (0)