反射机制
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