反射异步调用

西街长安
2023-07-06 / 0 评论 / 57 阅读 / 正在检测是否收录...

在 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

评论 (0)

取消