反射机制

https://blog.csdn.net/W3R32R32432/article/details/101155632?utm_medium=distribute.pc_relevant_download.none-task-blog-2~default~BlogCommendFromBaidu~default-1.test_version_3&depth_1-utm_source=distribute.pc_relevant_download.none-task-blog-2~default~BlogCommendFromBaidu~default-1.test_version_

public async Task<dynamic> Excute(string serverName,string functionName,object[] parameters)
    {
        return await Task.Factory.StartNew(() =>
        {
            var type = Type.GetType(serverName);
            var service = _serviceProvider.GetRequiredService(type);
            var method = type.GetMethod(functionName);
            var resultTask = method.Invoke(service, new object[] { }) as Task;
            dynamic result = resultTask.GetType().GetProperty("Result").GetValue(resultTask, null);
            return result;
        });
    }

    public async Task ExcuteWithoutResult(string serverName, string functionName, object[] parameters)
    {
        var type = Type.GetType(serverName);
        var service = _serviceProvider.GetRequiredService(type);
        var method = type.GetMethod(functionName);
        var resultTask = method.Invoke(service, new object[] { }) as Task;
        await resultTask;
        var msg = "task done";
        await Clients.Caller.SendAsync("callback",msg);
    }

方法中传入三个参数

serverName:服务接口名称(完整的命名空间)
functionName:方法的名称
parameters: 方法所需的参数

使用Type.GetType(serverName)获取服务接口的Type。
使用_serviceProvider.GetRequiredService(type)从依赖注入中获取对应服务。
使用type.GetMethod(functionName)获取需要执行的方法。
执行方法method.Invoke(service, new object[] { })

由于我们的服务是异步方法,method.Invoke()返回的是一个object对象,所以在将method.Invoke()返回类型转为Task类型。

resultTask.GetType().GetProperty(“Result”).GetValue(resultTask, null)是通过反射获取Task的Result属性来回去相应的返回结果。

因为我们不知道方法返回的Task中返回的结果类型是什么,所以我们依旧使用反射来获取Task的结果并使用dynamic接收。

无返回值的我们使用Clients.Caller.SendAsync()在任务处理结束后给调用方返回一条消息。

文档更新时间: 2024-02-25 09:52   作者:admin