Với giao diện sau:mở Generic Hạn chế
public interface IQuerySpec<M> { }
Tôi rất thích để thực hiện một phương pháp khuyến nông như thế này:
public static OrderedSortation<T> OrderBy<T, TKey>(
this T query,
Expression<Func<T, TKey>> sort)
where T : IQuerySpec<?> {
//business as usual
}
tôi chỉ đơn giản muốn chắc chắn rằng loại T
là một số biến thể của IQuerySpec<M>
. sau đó tôi có thể gọi phương thức mở rộng như sau:
public class Foo : IQuerySpec<int> {
public int SizeOfSailBoat {get; set;}
}
IQuerySpec<Foo> foo = new Foo {SizeOfSailBoat = 10}.
var result = foo.OrderBy(f => f.SizeOfSailBoat);
Các UDT Foo
đã được chỉ định trong ví dụ trên, nhưng tôi không quan tâm những gì tham số kiểu generic được sử dụng.
Có cách nào để thực hiện việc này không?
tôi thử như sau:
public static OrderedSortation<T> OrderBy<T, M, TKey>(
this T query,
Expression<Func<T, TKey>> sort)
where T : IQuerySpec<M> {
//business as usual
}
Các công trình trên, nhưng đòi hỏi rằng các tham số chung được quy định rõ ràng để gọi "OrderBy". Tôi không muốn được yêu cầu nêu rõ các thông số chung.
Tôi cũng đã cố gắng này:
public interface IQuerySpec {}
public interface IQuerySpec<M> : IQuerySpec {}
Với các giao diện sau đó tôi có thể làm điều này:
public static OrderedSortation<T> OrderBy<T, TKey>(
this T query,
Expression<Func<T, TKey>> sort)
where T : IQuerySpec {
//business as usual
}
này là gần như đủ tốt, ngoại trừ việc tôi muốn ẩn IQuerySpec không chung chung quá rằng nó không thể nhìn thấy bên ngoài thư viện lớp học của tôi. Tôi rất thích nếu tôi có thể có phạm vi giao diện không chung chung theo cách này:
internal interface IQuerySpec {}
Thật không may trình biên dịch sẽ không cho phép tôi làm điều đó.
Tôi đoán những gì tôi muốn là không thể, nhưng yêu cầu chỉ trong trường hợp.
Bạn có thể đưa ra ví dụ về những gì bạn muốn cú pháp của việc sử dụng giống như không? –
@Mike: Tôi đã thêm ví dụ gọi. –