- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
一些背景知识,我正在使用其他人编写的一些代码。这是一个 REST API,您可以向其发出查询和命令,并且它们以通用方式处理。
解析查询的方法是这样的:
[HttpPost]
[Route("query")]
public async Task<Task> ResolveQuery(ApiQuery message)
{
var type = Type.GetType(message.QueryType, true);
var query = this.serializer.Deserialize(message.Payload, type);
var interfaceType = type.GetGenericInterfaces(typeof(IQuery<>)).FirstOrDefault();
var responseType = interfaceType.GetGenericArguments()[0];
var handleMethod = typeof(IQueryBus).GetMethod("ResolveAsync").MakeGenericMethod(responseType);
var task = handleMethod.Invoke(this.bus, new object[] { query }) as Task;
await task;
return task;
}
我很确定以这种方式使用任务是非常不寻常的。
因此,当调用 handleMethod 时,即使它的结果被转换为任务,并且在调试期间当我将鼠标悬停在它上面时我可以看到一个有效结果,但没有任务.Result
成员供我用于最终转换。
我尝试过的事情:
我已尝试使用 Convert.ChangeType(result, responseType);
将此 handleMethod.Invoke 转换为我需要的“resopnseType”,但我遇到了未实现 IConvertible 的异常。我真的必须为我需要返回的每种类型实现 IConvertible 吗?
我也试过将返回类型设置为 Task,但我需要在 ResolveQuery 中指定 TResponse,这会导致内部服务器错误(我不确定如何从调用代码中指定 TResponse)。
我也试过问程序员他在这里做什么。他不知道。他正在按照另一位程序员的原始建议进行此实现,但该程序员目前不在,否则我会问他!
谁能告诉我如何正确地从任务对象中获取结果并将其以 RESTful 方式返回给调用客户端?
更新 - 回应@Yeldar Kurmangaliyev
public interface IQueryBus
{
Task<TResponse> ResolveAsync<TResponse>(IQuery<TResponse> query);
}
最佳答案
没有Result
,因为它只是一个非泛型 Task
.
为了获得结果,您需要 Task<T>
.因为你不知道 T
在设计时,你需要再次使用反射:
public async Task<object> ResolveQuery(ApiQuery message)
{
var type = Type.GetType(message.QueryType, true);
var query = this.serializer.Deserialize(message.Payload, type);
var interfaceType = type.GetGenericInterfaces(typeof(IQuery<>)).Single();
var responseType = interfaceType.GetGenericArguments().Single();
var handleMethod = typeof(IQueryBus).GetMethod("ResolveAsync").MakeGenericMethod(responseType);
var task = (Task)handleMethod.Invoke(this.bus, new object[] { query });
await task;
return typeof(Task<>).MakeGenericType(responseType).GetProperty("Result").GetValue(task);
}
它将创建一个 Result
您的特定属性Task<responseType>
并返回它的值。
我也稍微更新了现有代码,作为建议:
[0]
和 .FirstOrDefault()
至 .Single()
避免NullReferenceException
, 因为预计只有一个值as Task
直接投,因为预计是Task
关于c# - 在 C# 中使用 MakeGenericMethod 后如何制作具体类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53410891/
今天我从一些旧的动态转换代码中得到了这个错误(我更改了最后一行并省略了堆栈跟踪的其余部分): Item has already been added. Key in dictionary: 'I
一些背景知识,我正在使用其他人编写的一些代码。这是一个 REST API,您可以向其发出查询和命令,并且它们以通用方式处理。 解析查询的方法是这样的: [HttpPost] [Route("query
我试图弄清楚从 Xamarin 部署 iOS 时的限制到底意味着什么。 http://developer.xamarin.com/guides/ios/advanced_topics/limitati
我正在尝试按如下方式使用 MethodInfo MakeGenericMethod: foreach (var type in types) {
我是一名优秀的程序员,十分优秀!