访问嵌套的泛型类型参数

时间:2015-04-09 15:31:14

标签: c# generics type-inference

假设我有一些像这样的代码:

// This represents some query that will return type T when executed.
public interface IQuery<T> { }

// An example query that returns bool
public class MyQuery : IQuery<bool> { }

// A separate class that's actually responsible for executing the queries.
public class Executor {
    public T Execute<T>(IQuery<T> query)
}

// Usage
executor.Execute(new MyQuery()) // => true/false

到目前为止没有问题。但是说我想更改我的执行器类,以便它负责实例化查询。理想情况下,我希望使用类似于:

// Usage
executor.Execute<MyQuery>() // => true/false

但是,我似乎无法找到一种方法来模拟这种方法签名。我能得到的最接近的是:

public T Execute<TQuery, T>() where TQuery : IQuery<T>

此签名的问题在于它需要显式指定所有类型参数。 T无法从TQuery推断出new MyQuery(),因为在推断类型参数时不考虑泛型类型约束。

到目前为止,我发现的唯一解决方法是设置一个伪参数来帮助推断形式参数。基本上回到原始示例,但不是使用default(MyQuery)传递实际实例,而是可以传递类似{{1}}的内容。虽然这很笨重,但API并不明显。

是否有一些我缺少的解决方法?

0 个答案:

没有答案