首页 > 解决方案 > 如果还使用了限制,如何转换并返回通用组合?

问题描述

我想创建一个 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”

标签: c#generics

解决方案


你能试着用安全的演员回来吗:

return new AddItemsOperation(
    request
) as Tout;


推荐阅读