c# - 如果还使用了限制,如何转换并返回通用组合?
问题描述
我想创建一个 OperationFactory。如果传入的话,这个 OperationFactory 应该返回一个基于 OperationRequest 的 Operation。
Operation 本身具有返回 OperationResult 的属性。
OperationResult 也是通用的。
在我的应用程序视图中,我得到了一些我能够创建的信息和一个 OperationRequest。我也会有一个 OperationHandler 那里。OperationHandler 将使用 OperationsFactory 来检索正确/所需的操作。
这将由 OperationHandler 执行。
interface IOperationFactory
{
Tout Operation<Tout, TResult, Tin, T>(Tin request)
where Tin : IOperationRequest
where TResult : IOperationResult<T>
where Tout : BaseOperation<T>;
}
interface IOperationHandler
{
IOperationResult<T> Handle<T>(IOperationRequest request);
}
interface IOperationResult<T>
{
Guid Id { get; }
Guid RequestId { get; }
T Value { get; }
}
/* Here's the part that is making my problems, its part of the OperationsFactory: */
public Tout Operation<Tout, TResult, Tin, T>(Tin request)
where Tout : BaseOperation<T>
where TResult : IOperationResult<T>
where Tin : IOperationRequest
{
if (request is AddItemsRequest)
{
var finalType = request as AddItemsRequest;
Type target = typeof(Tout);
return (Tout) new AddItemsOperation(request);
}
throw new InvalidOperationException();
}
public sealed class AddItemsRequest : IOperationRequest
{
public AddItemsRequest(List<Item> items, string site)
{
Id = Guid.NewGuid();
Items = items;
Site = site;
}
public Guid Id { get; }
public List<Item> Items { get; }
public string Site { get; }
}
public sealed class AddItemsOperation : BaseOperation<Tuple<IToken, IBasket>>
{
private readonly IApi _api;
private readonly IToken _token;
public AddItemsOperation(
IOperationRequest request,
)
: this(api, request)
{ }
public AddItemsOperation(Api api, IOperationRequest request)
: base(request)
{
_api = api;
}
public override IOperationResult<Tuple<IToken, IBasket>> Result()
{
/* Implementation Details Removed */
return new OperationResult
<Tuple<IToken, IBasket>>(
Request.Id,
);
}
private AddItemsRequest AddItemsRequest(IOperationRequest request)
{
if (!(request is AddItemsRequest))
{
throw new InvalidOperationException($"Supported type is only {typeof(AddItemsRequest).Name}");
}
return request as AddItemsRequest;
}
无法将类型“AddItemsRequest”转换为“Tout”
解决方案
你能试着用安全的演员回来吗:
return new AddItemsOperation(
request
) as Tout;
推荐阅读
- leaflet - 有没有办法在 CartoDB 中只显示城市标签?
- encryption - 如何在lua中将字节转换为字符串
- php - Elementor 两次显示相同的简码(仅在编辑器上)
- python - 100k 条记录的 PyMongo Bulk Upsert 性能
- html - 为网页正文过度滚动的顶部和底部赋予不同的颜色
- ios - 如何摆脱这些错误?
- redis - 来自一台服务器但不是来自另一台服务器的 Redis 密码错误
- c++ - 不确定是什么导致代码中出现错误 c2600
- bash - 如何让 for 循环输出一次而不是每次迭代?
- android - 设置 Detekt 自定义规则时出错