使用接口和泛型约束进行类型推断

2024-02-17

我正在构建一个通用查询调度程序。想法如下:

  • 通用接口IQuery<T>代表一个查询对象
  • 一个具体的查询类有一些 getter 和 setter(实现IQuery<T>)
  • 通用接口IQueryHandler<TReturnType, TQuery>使用一个接收 TQuery 的方法(有一个约束TQuery: IQuery<TReturnType>)并返回一个TReturnType
  • 具体处理程序实施IQueryHandler接收混凝土ConcreteQuery并返回一个 TQuery
  • A QueryDispatcher它有一个接收查询并返回结果的方法。具体类将从 DI 容器中查找正确的处理程序。

问题是当我调用时我没有得到类型推断Fetch方法上的QueryDispatcher。我可以做些什么来获得类型推断,还是这只是 C# 的限制?

理论上它应该知道类型参数是什么,因为它接收一个参数TQuery这有一个限制:IQuery<TReturnType.

这是代码:

class ConcreteClass    // This is the class of which I want to query objects
{
}

查询接口+具体查询类

interface IQuery<T>
{
}

public class ConcreteQuery : IQuery<ConcreteClass>
{
}

QueryHandler 接口 + 具体查询处理程序

interface IQueryHandler<TReturnType, TQuery> where TQuery : IQuery<TReturnType>
{
    TReturnType Fetch(TQuery query);
}

class ConcreteQueryHandler : IQueryHandler<ConcreteClass, ConcreteQuery>
{
    ConcreteClass Fetch(ConcreteQuery query)
    {
    }
}

QueryDispatcher(使用 DI 容器来解析正确的处理程序)

class QueryDispatcher
{
    TReturnType Fetch<TReturnType, TQuery>(TQuery query) 
        where TQuery : IQuery<TReturnType>
    {
        return myDIcontainer.Get<IQueryHandler<T, TQuery>>().Fetch(query);
    }
}

现在,当我像这样使用 QueryDispatcher 时,出现错误:

var queryDispatcher = new QueryDispatcher();
var c = queryDispatcher.Fetch(new ConcreteQuery());

当我提供类型参数时,一切正常:

var c = queryDispatcher.Fetch<ConcreteClass, ConcreteQuery>(new ConcreteQuery());

您想要的是两级类型推断,而编译器不会这样做。

您可能需要重新考虑您的查询调度程序。将其视为需要IQuery<TReturnType>并返回一个TReturnType.

尝试将您的查询调度程序更改为:

class QueryDispatcher
{
    public TReturnType Fetch<TReturnType>(IQuery<TReturnType> query) 
    {
        return myDIcontainer
            .Get<IQueryHandler<TReturnType, IQuery<TReturnType>>>()
            .Fetch(query);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用接口和泛型约束进行类型推断 的相关文章

随机推荐