Angesichts der folgende Schnittstelle:öffnen Allgemein Constraint
public interface IQuerySpec<M> { }
Ich würde gerne eine Verlängerung Methode wie folgt machen:
public static OrderedSortation<T> OrderBy<T, TKey>(
this T query,
Expression<Func<T, TKey>> sort)
where T : IQuerySpec<?> {
//business as usual
}
ich einfach sicher sein T
diese Art wollen, ist eine gewisse Variation von IQuerySpec<M>
. Ich konnte die Erweiterungsmethode dann rufen Sie wie folgt vor:
public class Foo : IQuerySpec<int> {
public int SizeOfSailBoat {get; set;}
}
IQuerySpec<Foo> foo = new Foo {SizeOfSailBoat = 10}.
var result = foo.OrderBy(f => f.SizeOfSailBoat);
Die UDT Foo
im obigen Beispiel bezeichnet wurde, aber mir egal, welche generischen Typparameter verwendet wird.
Gibt es eine Möglichkeit, dies zu tun?
Ich habe versucht, die folgenden:
public static OrderedSortation<T> OrderBy<T, M, TKey>(
this T query,
Expression<Func<T, TKey>> sort)
where T : IQuerySpec<M> {
//business as usual
}
Die oben genannten Arbeiten, erfordert aber, dass die generischen Parameter explizit angegeben, um sich „OrderBy“ aufzurufen. Ich möchte die generischen Parameter nicht explizit angeben müssen.
Ich habe auch versucht diese:
public interface IQuerySpec {}
public interface IQuerySpec<M> : IQuerySpec {}
Mit diesen Schnittstellen kann ich dies dann tun:
public static OrderedSortation<T> OrderBy<T, TKey>(
this T query,
Expression<Func<T, TKey>> sort)
where T : IQuerySpec {
//business as usual
}
Dies ist fast gut genug, mit der Ausnahme, dass ich die nicht-generic IQuerySpec ausblenden möchten so dass es außerhalb meiner Klassenbibliothek nicht sichtbar ist. Ich würde gerne, wenn ich die nicht-generische Schnittstelle auf diese Weise scoped haben könnte:
internal interface IQuerySpec {}
Leider wird der Compiler nicht lassen Sie mich das tun.
Ich rate, was ich will, ist nicht möglich, aber nur für den Fall zu fragen.
Können Sie ein Beispiel geben, wie die Syntax der Verwendung aussehen soll? –
@Mike: Ich habe ein Aufrufbeispiel hinzugefügt. –