【发布时间】:2016-01-09 11:45:36
【问题描述】:
给定如下界面:
public interface IQuerySpec<M> { }
我很想做一个这样的扩展方法:
public static OrderedSortation<T> OrderBy<T, TKey>(
this T query,
Expression<Func<T, TKey>> sort)
where T : IQuerySpec<?> {
//business as usual
}
我只是想确定T 类型是IQuerySpec<M> 的一些变体。然后我可以如下调用扩展方法:
public class Foo : IQuerySpec<int> {
public int SizeOfSailBoat {get; set;}
}
IQuerySpec<Foo> foo = new Foo {SizeOfSailBoat = 10}.
var result = foo.OrderBy(f => f.SizeOfSailBoat);
上面的例子中指定了UDTFoo,但我不在乎使用什么泛型类型参数。
有没有办法做到这一点?
我尝试了以下方法:
public static OrderedSortation<T> OrderBy<T, M, TKey>(
this T query,
Expression<Func<T, TKey>> sort)
where T : IQuerySpec<M> {
//business as usual
}
上述方法有效,但需要明确声明通用参数才能调用“OrderBy”。我不想被要求明确声明泛型参数。
我也试过这个:
public interface IQuerySpec {}
public interface IQuerySpec<M> : IQuerySpec {}
有了这些接口,我就可以这样做了:
public static OrderedSortation<T> OrderBy<T, TKey>(
this T query,
Expression<Func<T, TKey>> sort)
where T : IQuerySpec {
//business as usual
}
这几乎足够了,除了我想隐藏非泛型 IQuerySpec 以便它在我的类库之外不可见。如果我能以这种方式限定非泛型接口,我会很高兴:
internal interface IQuerySpec {}
很遗憾,编译器不允许我这样做。
我猜我想要什么是不可能的,但以防万一。
【问题讨论】:
-
你能举个例子说明你希望使用的语法是什么样的吗?
-
@Mike:我添加了一个调用示例。