J'essaie d'ajouter une autre restriction à une méthode dans une classe générique. Est-ce possible?C#: Ajouter une méthode générique conditionnelle (restriction générique différente) dans la classe générique
pseudocode:
public class MyBaseClass<T> where T: class
{
public IQueryable<T> ShowThisMethod where T: class, IMyInterface
{
// stuff.
}
}
ShowThisMethod ne devrait être disponible que lorsque T est IMyInterface. IMyInterface devrait aussi redonner des informations (à propos de T) afin que je puisse accéder aux propriétés définies dans IMyInterface à l'intérieur de la méthode.
Aide :)
Par ailleurs, cette compile (et semble "presque droite"):
public class MyBaseClass<T> where T: class
{
public IQueryable<T> ShowThisMethod<T>() where T: class, IMyInterface
{
String X = T.MyInterfaceStringProperty;
}
}
Plus d'informations au sujet de mon objectif:
I utilise une classe de base générique pour accéder à une propriété commune (propriété DateTime "Time" sur l'objet LINQ Dinner qui est également sur Déjeuner).
Les deux objets implémentent ITimeable qui expose la propriété DateTime.
Dans ma classe de base, je voudrais avoir une méthode Select() qui fonctionne sur IQueryable & ltT> et peut filtrer automatiquement en fonction de la propriété Time. Parce que je travaille hors du générique T, la propriété time n'est pas visible à la classe de base, sauf si je lui dis que T est en train d'implémenter ITimeable. Je souhaite que la même classe de base fonctionne pour d'autres objets non-ITimeable, c'est pourquoi j'ai besoin de la restriction d'interface sur la méthode Select, et j'en ai besoin pour accéder à la propriété Time en utilisant des génériques.
espoir qui efface le but :)
post-scriptum Ma principale préoccupation n'est pas la visibilité de la méthode dans IntelliSense, etc.. Je voudrais simplement que ma classe de base fonctionne, tout en étant capable d'accéder à une propriété spécifiée par l'interface via des génériques.
Ce second code ne compile pas pour moi, je reçois un message d'erreur indiquant que le paramètre de type « T » a le même nom que le paramètre type du type externe '... MyBaseClass'. –
Je reçois cela comme un avertissement aussi, oui, mais compile pour moi. – Alex
Ce n'est pas la même chose que de redéfinir les contraintes. Fondamentalement, vous pouvez avoir quelque chose comme MyBaseClass .ShowThisMethod (), par exemple. Je doute que ce soit ce que tu veux. –