考慮到如下界面:開放通用的限制
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);
的UDT Foo
在上面的例子中被指定,但我不在乎是做什麼用泛型類型參數。
有沒有辦法做到這一點?
我試過如下:
public static OrderedSortation<T> OrderBy<T, M, TKey>(
this T query,
Expression<Func<T, TKey>> sort)
where T : IQuerySpec<M> {
//business as usual
}
上述工作,但要求通用參數,以便明確指出調用「排序依據」。我不希望被要求明確說明通用參數。
我也試過這樣:
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:我添加了一個調用示例。 –