簡體   English   中英

使用接口和通用約束鍵入推斷

[英]Type inference with interfaces and generic constraints

我正在構建一個通用的查詢調度程序。 這個想法如下:

  • 通用接口IQuery<T> ,表示查詢對象
  • 具體的查詢類有一些getter和setter(實現IQuery<T>
  • 通用接口IQueryHandler<TReturnType, TQuery>帶有一個接收TQuery的方法(對TQuery: IQuery<TReturnType>有約束TQuery: IQuery<TReturnType> )並返回TReturnType
  • 實現IQueryHandler具體處理程序,它接收具體的ConcreteQuery並返回一個TQuery
  • 一個QueryDispatcher ,它有一個接收Query並返回結果的方法。 具體類將從DI容器中查找正確的處理程序。

問題是當我在QueryDispatcher上調用Fetch方法時,我沒有得到類型推斷。 有什么我可以做的類型推斷或這只是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);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM