假设我有一些像这样的代码:
// 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并不明显。
是否有一些我缺少的解决方法?